2012-04-10 127 views
1

有沒有人有一個例程來將NSFileSystemFreeSize的結果轉換爲可用的mb/gb的用戶友好字符串。我認爲我有這個要點,但我得到的結果很奇怪。NSFileSystemFreeSize:將結果轉換爲用戶友好的mb/gb顯示?

- (NSString*)getFreeSpace 
{ 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:documentsDirectory error:NULL]; 
unsigned long long freeSpaceInBytes = [[fileAttributes objectForKey:NSFileSystemFreeSize] unsignedLongLongValue]; 

NSString * space = [NSString stringWithFormat:@"Free Space: %fll", freeSpaceInBytes /1024./1024. /1024.]; 

NSLog(@"freeSpaceInBytes %llull %fll", freeSpaceInBytes, freeSpaceInBytes /1024./1024. /1024.); 

return space; 
} 

回答

6
static NSString* prettyBytes(uint64_t numBytes) 
{ 
    uint64_t const scale = 1024; 
    char const * abbrevs[] = { "EB", "PB", "TB", "GB", "MB", "KB", "Bytes" }; 
    size_t numAbbrevs = sizeof(abbrevs)/sizeof(abbrevs[0]); 
    uint64_t maximum = powl(scale, numAbbrevs-1); 
    for (size_t i = 0; i < numAbbrevs-1; ++i) { 
     if (numBytes > maximum) { 
      return [NSString stringWithFormat:@"%.4f %s", numBytes/(double)maximum, abbrevs[i]]; 
     } 
     maximum /= scale; 
    } 
    return [NSString stringWithFormat:@"%u Bytes", (unsigned)numBytes]; 
} 
+0

這就是甜!謝謝。我永遠不會想出如此優雅的東西。 – 2012-04-10 22:01:33

+0

嘿,我是新來的Objective-C,我想知道如何登錄這個NSString。的NSLog(@ 「%@」,prettyBytes);不工作'Format指定類型'id',但參數的類型爲'NSString *(*)(uint64_t)''。 – iDev 2014-07-25 10:04:59

+0

你正在發送它的功能本身。你需要調用它的東西......'NSLog(@「%@」,prettyBytes(someNumberOfBytes))' – 2014-07-26 02:23:49

相關問題