2011-12-15 10 views
7

में नेटवर्क ड्राइव पर नि: शुल्क डिस्क स्थान मैं ए 2 कंप्यूटिंग के लिए एक प्रोग्राम बना रहा हूं जो बहुत सारे डेटा निर्यात करता है। स्थानीय नेटवर्क पर मेरा एचडीडी आवंटन लगभग 50 एमबी है, इसलिए "कोई डिस्क स्पेस" त्रुटि का परीक्षण करने के लिए यह एक अच्छा उम्मीदवार है।डेल्फी

वर्तमान में जब प्रोग्राम अंतरिक्ष से बाहर हो जाता है तो यह I/O त्रुटि 112 के साथ मध्य-निर्यात को क्रैश करता है। यदि फ़ाइल उपलब्ध स्थान से अधिक हो तो मैं समय से पहले चेतावनी देना चाहता हूं। मुझे पता है कि फ़ाइल कितनी बड़ी होगी (औसत पर 24.8 बाइट प्रति रिकॉर्ड), इसलिए मुझे बस इतना करना है कि कितनी जगह खाली है।

जैसा कि मैं \\qmcsan1\Cxxxxx$\filename.csv जैसे फ़ाइल पथ के साथ नेटवर्क ड्राइव पर काम कर रहा हूं, मैं उपलब्ध स्थान की गणना करने के लिए DiskFree जैसे फ़ंक्शंस का उपयोग कैसे करूं? इस तरह के किसी भी समारोह को C:/ जैसे स्थानीय ड्राइव को संभालने की भी आवश्यकता है।

किसी भी विचार की बहुत सराहना की।

+3

RRUZ देखें जवाब इतना थ्रेड [कैसे करने के लिए मिल-कुल-डिस्क-स्थान-ऑफ-windows-ड्राइव] (http://stackoverflow.com/questions/6383598/delphi-how-to जाओ-कुल-डिस्क-स्थान-ऑफ-windows-ड्राइव)। डब्ल्यूएमआई का उपयोग करता है और दूरस्थ कंप्यूटर पर काम करता है। –

+0

@ एलयू आरडी, डब्लूएमआई दुरुपयोग वास्तव में क्रोधित दृष्टिकोण है। मैं इस मामले की पूर्ववत करता हूं जब शेयर का उपयोग करने के लिए अधिकृत उपयोगकर्ता डब्लूएमआई विशेषाधिकार जांच में विफल रहता है। – OnTheFly

+4

@LU RD यदि उपयोगकर्ता वॉल्यूम पर लिखने में सक्षम है तो संभवतः वे भारी वजन WMI की आवश्यकता के बजाय मुक्त स्थान प्राप्त करने के लिए Win32 API का उपयोग कर सकते हैं। –

उत्तर

9

एक आसान तरीका GetDiskFreeSpaceEx एपीआई फ़ंक्शन को कॉल करना है।

दुर्भाग्यवश यह फ़ंक्शन डेल्फी विंडोज इकाई में गलत घोषित किया गया है, कम से कम यह XE2 में है। लेकिन SysUtils में एक संस्करण घोषित किया गया है जो सही है। सुनिश्चित करें कि आप उस संस्करण का उपयोग करें!

program FreeDiskSpace; 
{$APPTYPE CONSOLE} 
uses 
    SysUtils; 

const 
    Folder = 'C:\'; 

var 
    FreeAvailable, TotalSpace: Int64; 

begin 
    if SysUtils.GetDiskFreeSpaceEx(PChar(Folder), FreeAvailable, TotalSpace, nil) then begin 
    Writeln(TotalSpace div (1024*1024*1024), 'GB total'); 
    Writeln(FreeAvailable div (1024*1024*1024), 'GB free'); 
    end; 
end. 
इस में
+0

इसके लिए धन्यवाद - ऐसा लगता है कि यह काम करेगा। केवल समस्या यह है कि, मैं डेल्फी में एक पूर्ण नोब हूं। मैं 'GetDiskFreeSpaceEx (PWideChar (save_dialog.FileName), @freespace, nil, nil)' की कोशिश कर रहा हूं, लेकिन यह कभी भी 'freespace' में किसी भी संख्या को संग्रहीत नहीं कर रहा है। कोई विचार क्यों? –

+0

आप शायद डेल्फी के एएनएसआई संस्करण पर हैं। मेरा अपडेट देखें। मेरे अंतिम पैराग्राफ में वर्णित परिवर्तन करें और इसे इस तरह कॉल करें: 'GetDiskFreeSpaceEx (पीसीहर (save_dialog.FileName), @freespace, nil, nil) '। या @TLama भी सही हो सकता है। –

+0

... या बस 'पीसीहर' का उपयोग करें और यह सभी डेल्फी संस्करणों में काम करेगा। – jpfollenius