2009-10-26 6 views

उत्तर

13
+0

का उपयोग करके मुक्त स्थान मिल सकता है। – zekel

+1

ओह, आप सही थे। ऐसा लगता है कि मैंने वर्ग पर कोशिश की, उदाहरण नहीं। – zekel

+0

नमस्ते, क्या होगा यदि पथ में उप-फ़ोल्डरों में से कोई एक अन्य फाइल सिस्टम को इंगित करता है, तो क्या NSFileManager गुणों को पुनर्प्राप्त करते समय इसे अनदेखा करना जानता है? – Zohar81

9

संपादित fileSystemAttributesAtPath: हटाई गई है, उपयोग attributesOfFileSystemForPath: त्रुटि: के रूप में एनएसडी का सुझाव दिया। मैंने गलती की जब मैंने सोचा कि यह काम नहीं करता है। त्रुटि लेकिन dict लौटे NSFileSystemFreeNodes कुंजी है लगता नहीं किया:

// this works 
NSError *error = nil; 
NSDictionary *attr = [NSFM attributesOfFileSystemForPath:@"/" error:&error]; 
if (!error) { 
    double bytesFree = [[attr objectForKey:NSFileSystemFreeSize] doubleValue]; 
} 

मैं इस, attributesOfItemAtPath की कोशिश की।

NSFileManager *fm = [NSFileManager defaultManager]; 
NSError *error = nil; 
NSDictionary *attr = [fm attributesOfItemAtPath:@"/" error:&error]; 
if (!error) { 
    NSLog(@"Attr: %@", attr); 
} 

2009-10-28 17:21:11.936 MyApp[33149:a0b] Attr: { 
    NSFileCreationDate = "2009-08-28 15:37:03 -0400"; 
    NSFileExtensionHidden = 0; 
    NSFileGroupOwnerAccountID = 80; 
    NSFileGroupOwnerAccountName = admin; 
    NSFileModificationDate = "2009-10-28 15:22:15 -0400"; 
    NSFileOwnerAccountID = 0; 
    NSFileOwnerAccountName = root; 
    NSFilePosixPermissions = 1021; 
    NSFileReferenceCount = 40; 
    NSFileSize = 1428; 
    NSFileSystemFileNumber = 2; 
    NSFileSystemNumber = 234881026; 
    NSFileType = NSFileTypeDirectory; 
} 

looking around a bit के बाद, यह fileSystemAttributesAtPath की तरह लगता है: विधि है कि यह देता है। अजीब।

NSFileManager *fm = [NSFileManager defaultManager]; 
NSDictionary *attr = [fm fileSystemAttributesAtPath:@"/"]; 
NSLog(@"Attr: %@", attr); 


2009-10-28 17:24:07.993 MyApp[33283:a0b] Attr: { 
    NSFileSystemFreeNodes = 5027061; 
    NSFileSystemFreeSize = 20590841856; 
    NSFileSystemNodes = 69697534; 
    NSFileSystemNumber = 234881026; 
    NSFileSystemSize = 285481107456; 
} 
+0

"... विशेषताओं का उपयोग करेंफाइल सिस्टम सिस्टमफॉरपैथ: त्रुटि: इसके बजाय।" एनएसडी ने यही सुझाव दिया, और आपने उसे बताया कि यह काम नहीं करता है। क्या यह अब काम करता है? –

+0

हाँ, यह करता है। ऐसा लगता है कि मैंने पहले गलती की थी। – zekel

+2

दो आलोचकों: 'त्रुटि:' पैरामीटर किसी ऑब्जेक्ट को पॉइंटर पर पॉइंटर लेते हैं, 'एनएसईआरर **'। इस प्रकार, सही नल सूचक स्थिरांक 'शून्य 'नहीं है (जो किसी ऑब्जेक्ट के लिए सूचक होगा, या तो' * 'या' id'), यह 'NULL' है। सबसे महत्वपूर्ण बात यह है कि एरर रिटर्न-पास एक वैरिएबल को पॉइंटर को दबाएं, और त्रुटि को रिपोर्ट करें यदि (और केवल अगर) गुण पुनर्प्राप्त करने का प्रयास विफल रहता है।मूक विफलता खराब है। –

7

मैं इस का उपयोग करें:

NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" 
                        error:&error]; 
unsigned long long freeSpace = [[fileAttributes objectForKey:NSFileSystemFreeSize] longLongValue]; 
NSLog(@"free disk space: %dGB", (int)(freeSpace/1073741824)); 
+0

बिल्कुल सही कोड! आकर्षण की तरह काम करता है! साझा करने के लिए बहुत बहुत धन्यवाद। :) – zeFree

+0

मेरा 2 सेंट - 1) अन्य वॉल्यूम्स के लिए जानकारी देखने के लिए @ "/" के स्थान पर वॉल्यूम के पथ वाले एनएसएसटींग का उपयोग करें। 2) यह बेहतर होगा अगर हम लंबे समय तक चलने के बजाय unsignedLongLongValue का उपयोग करें। – zeFree

-1

हार्ड डिस्क उपकरण निर्माताओं, उपयोग:

1GB = 1000MB

1 एमबी = 1000 KB आदि

यदि आप देखते हैं विंडोज़ में एक 8 जीबी यूएसबी स्टिक हमेशा वास्तविक से कम जगह दिखाती है (जैसे 7,8 जीबी) क्योंकि यह 1 जीबी = 1024 एमबी माना जाता है)। ओएसएक्स में एक ही यूएसबी स्टिक 8 जीबी (असली) है।

तो (freeSpace/1073741824) होना चाहिए (freeSpace/1000000000)

कम से कम OSX में

+0

किसके पास डाउनवोट है, मैं गiga, मेगा इत्यादि के अर्थ के लिए ग्रीक शब्दावली को देखने के लिए आमंत्रित करता हूं .. – Mike97

+0

आपका उत्तर अच्छा और संभावित रूप से उपयोगी मामूली है, लेकिन यह पूछे जाने वाले प्रश्न का उत्तर नहीं देता है। –

+0

धन्यवाद माइकल, मैं इस के साथ वास्तव में ठीक हूं (यानी यदि मेरी टिप्पणी ओटी है), लेकिन दुर्भाग्य से यहां दिए गए उत्तरों को केवल गलत माना गया था यदि आप कोको टैग + हार्डड्राइव पर विचार करते हैं। मेरे उत्तर में पहले से ही पोस्ट किए गए कोड में सुधार शामिल है (यह ठीक होना चाहिए क्योंकि सुधार नहीं है लेकिन सुधार है)। तो यदि आप सही जगह को छोड़ देते हैं, तो आपको 1024 के बजाय 1000 में से कई का उपयोग करना होगा अन्यथा परिणाम गलत होगा, क्योंकि कोको पहले ही इसका उपयोग कर रहा है। – Mike97

0

this post से प्राप्त करें:

- (uint64_t)freeDiskspace 
{ 
    uint64_t totalSpace = 0; 
    uint64_t totalFreeSpace = 0; 

    __autoreleasing NSError *error = nil; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error]; 

    if (dictionary) { 
     NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize]; 
     NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize]; 
     totalSpace = [fileSystemSizeInBytes unsignedLongLongValue]; 
     totalFreeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue]; 
     NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll)); 
    } else { 
     NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %d", [error domain], [error code]); 
    } 

    return totalFreeSpace; 
} 

मुख्य अंतर यह है कि आप NSSearchPathForDirectioriesInDomains का उपयोग करना चाहिए, अन्यथा मैं सिम्युलेटर पर सही मान रही थी , लेकिन डिवाइस '/' फ़ोल्डर संदर्भ पर मुझे 190 एमबी की तरह कुछ देता है जो सही नहीं था। यह करने में महत्वपूर्ण NSFileSystemFreeSize के साथ एक dict वापस नहीं करता है [: त्रुटि NSFileManager attributesOfFileSystemForPath] -

1

तेजी के माध्यम से आप इस समारोह

func getFreeSpace() -> CGFloat { 
     do { 
     let fileAttributes = try NSFileManager.defaultManager().attributesOfFileSystemForPath("/") 
     if let size = fileAttributes[NSFileSystemFreeSize] as? CGFloat { 
      return size 
     } 
     } catch { } 
     return 0 
    } 
+2

एक ही सामग्री के साथ कई उत्तरों पोस्ट न करें। आपने इसे पहले ही यहां पोस्ट किया है http://stackoverflow.com/a/36654477/1743880। एक अच्छा जवाब पोस्ट करें और दूसरे को डुप्लिकेट के रूप में फ़्लैग करें। – Tunaki

संबंधित मुद्दे