Search code examples
iosios5

NSFileSystemFreeSize: translating result into user friendly display of mb/gb?


Does anyone have a routine to translate the result of NSFileSystemFreeSize into a user friendly string of the mb/gb available. I thought I had the gist of it but I am getting odd results.

- (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;
}

Solution

  • 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];
    }