为什么NSFileSystemFreeSize的值与iOS设置中报告的空闲大小不同?

下面是我用来获取我的应用程序的iOS设备上的可用存储空间:

NSDictionary *dict = [[NSFileManager defaultManager] fileSystemAttributesAtPath:@"/var"]; NSNumber *freeSpace = [dict valueForKey:@"NSFileSystemFreeSize"]; 

但是, freeSpace与设置应用程序中显示的值freeSpace 。 该值始终大于设置显示的值。 例如, freeSpace约为600,000,000字节,其中设置显示357 MB。

为什么是这个,我怎样才能得到与设置显示的值相同的值?

我敢打赌,你正在使用32位整数或浮点types来存储你的文件系统的大小值。 这将失败,足够大的文件大小。 相反,使用无符号long long或long doubletypes来存储这些值。

请参阅此答案的更正版本以了解如何准确读取这些文件大小。 对该答案和其他人的评论表明,这返回的值与iTunes和其他工具报告的自由尺寸相匹配。

我在iOS5.1.4的iPhone5上也有相同的结果。

 double freeSpaceMB = -1.; long long freeSpace = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemFreeSize] longLongValue]; freeSpaceMB = (freeSpace * 1.)/ (1024 * 1024); 

X – 来自设置的值(用法)

我总是得到freeSpaceMB = X + 200。

我想这是iOS的储备空间。 但这只是猜测。

昨天发布的另一个问题是作为这个问题的复制而被封闭的,而另一个问题则表明了另一种可能导致错误的方式。

那个提问者做的是这样的:

 uint64_t freeSpace = (uint64_t)[fileSystemAttributes objectForKey:NSFileSystemFreeSize]; NSLog(@"Free space in bytes: %lld.",freeSpace); 

他们将对象本身(更准确地说是对象在内存中的地址)作为空闲字节数来处理。 这是错误的; 该对象是一个NSNumber对象,它包装了这样一个数字。 正确的代码会询问对象的unsignedLongLongValue ,它是正确的types,因此足够大以保存正确的值。