Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件大小问题-Cocoa_Cocoa_Floating Point_64 Bit_Integer - Fatal编程技术网

文件大小问题-Cocoa

文件大小问题-Cocoa,cocoa,floating-point,64-bit,integer,Cocoa,Floating Point,64 Bit,Integer,我编写了一些方法,可以帮助我获得文件/文件夹的大小,并将结果转换为人类可读的字符串。问题是,当这个大小超过2.1GB时,返回的数字会变成一个随机的负数,比如“-4324234423字节”,这是无用的 关于这个问题,我发现并做了一些事情: 32GB限制为这个大小,所以我改为64位编译 我已经尝试使用CGFloat和NSInteger,但它们仍然返回与NSInteger相同的值 我很沮丧,我不知道我错过了什么。以下是我的方法: - (NSString *)stringFromFileSize:(

我编写了一些方法,可以帮助我获得文件/文件夹的大小,并将结果转换为人类可读的字符串。问题是,当这个大小超过2.1GB时,返回的数字会变成一个随机的负数,比如“-4324234423字节”,这是无用的

关于这个问题,我发现并做了一些事情:

  • 32GB限制为这个大小,所以我改为64位编译
  • 我已经尝试使用CGFloat和NSInteger,但它们仍然返回与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;
}
-(NSString*)stringFromFileSize:(int)大小
{
CGFloat floatSize=尺寸;

如果(大小唉,几乎所有系统的“int”都是32位的,即使您“编译为64位”。(Windows、Mac和Linux都是这样工作的)。请参阅


您可以将
long
传递给
stringFromFileSize
方法,也可以稍微晚一点传递
NSUInteger
,但您可以将这一行与正确的数字格式化程序配合使用:

NSString *fileSizeStr = [NSByteCountFormatter stringFromByteCount:fileSize countStyle:NSByteCountFormatterCountStyleFile]; 

我认为CGFloat也是64位的?问题是,当您在“stringFromFileSize”中创建“CGFloat”时,该值已经是一个“int”(函数的参数),如果您处理的是大值,则该值一定是错误的,因为如果整数是32位签名的,则不能存储大于2G的值。问题已解决。我无法相信我错过了,非常感谢!+1给出了一个很好的答案!没问题,我确实坐了好几个小时,一直盯着完全相同的问题,所以我很高兴能提供帮助!我使用的第一个操作系统d对于专业工作,“tru64”,它太旧了,现在已经停止使用,使用64位表示int。我甚至没有想到像Linux、Mac、Windows这样的现代操作系统在其64位版本上只使用32位int(