2012-04-10 2 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

Это сладкое! Спасибо. Я бы никогда не придумал что-то настолько элегантное. –

+0

Эй, я новичок в объективе-с, и мне было интересно, как я могу зарегистрировать этот NSString. NSLog (@ "% @", prettyBytes); не работает 'Format указывает тип 'id', но аргумент имеет тип 'NSString * (*) (uint64_t)''. – iDev

+0

Вы отправляете эту функцию самостоятельно. Вам нужно называть это чем-то ... 'NSLog (@"% @ ", prettyBytes (someNumberOfBytes))' –

Смежные вопросы