【发布时间】:2011-04-27 00:38:32
【问题描述】:
我编写了一些方法来帮助我获取文件/文件夹的大小并将结果转换为人类可读的字符串。问题是,当这个大小超过 2.1GB 左右时,返回的数字会变成一个随机的负数,比如“-4324234423 字节”,这是没有用的。
我发现并解决了这个问题:
- 32GB 仅限于此大小,所以我改为编译为 64 位。
- 我尝试过同时使用 CGFloat 和 NSUInteger,但它们仍然返回与 NSInteger 相同的值。
我很沮丧,我不知道我错过了什么。这是我的方法:
- (NSString *)stringFromFileSize:(int)theSize
{
CGFloat floatSize = theSize;
if (theSize<1023)
return([NSString stringWithFormat:@"%i bytes",theSize]);
floatSize = floatSize / 1024;
if (floatSize<1023)
return([NSString stringWithFormat:@"%1.1f KB",floatSize]);
floatSize = floatSize / 1024;
if (floatSize<1023)
return([NSString stringWithFormat:@"%1.2f MB",floatSize]);
floatSize = floatSize / 1024;
return([NSString stringWithFormat:@"%1.2f GB",floatSize]);
}
- (NSUInteger)sizeOfFile:(NSString *)path
{
NSDictionary *fattrib = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
NSUInteger fileSize = (NSUInteger)[fattrib fileSize];
return fileSize;
}
- (NSUInteger)sizeOfFolder:(NSString*)folderPath
{
NSArray *contents;
NSEnumerator *enumerator;
NSString *path;
contents = [[NSFileManager defaultManager] subpathsAtPath:folderPath];
enumerator = [contents objectEnumerator];
NSUInteger fileSizeInt = 0;
while (path = [enumerator nextObject]) {
NSDictionary *fattrib = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:path] error:nil];
fileSizeInt +=[fattrib fileSize];
}
return fileSizeInt;
}
我错过了什么? NSFileManager 是否返回 32 位值?这是什么原因造成的?
谢谢!
【问题讨论】:
标签: cocoa floating-point 64-bit integer