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

时间:2012-07-30 07:46:21

标签: ios storage

以下是我用来为我的应用获取iOS设备上的可用存储空间的内容:

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

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

为什么会这样,我如何获得与设置显示的值相同的值?

4 个答案:

答案 0 :(得分:4)

在iOS 11下,有新的音量容量键可以传递给URL.resourceValues(forKeys:),提供的值与设备设置中的值相匹配。

  • static let volumeAvailableCapacityKey: URLResourceKey 卷的可用容量的密钥(以字节为单位)(只读)。

  • static let volumeAvailableCapacityForImportantUsageKey: URLResourceKey 用于存储重要资源的卷的可用容量(以字节为单位)的密钥(只读)。

  • static let volumeAvailableCapacityForOpportunisticUsageKey: URLResourceKey 用于存储非必要资源的卷的可用容量(以字节为单位)的密钥(只读)。

  • static let volumeTotalCapacityKey: URLResourceKey 卷的总容量的密钥(以字节为单位)(只读)。

来自Apple's documentation

  

概述

     

在尝试在本地存储大量数据之前,请先验证您是否有足够的存储容量。要获取卷的存储容量,请构造一个URL(使用URL实例),该URL引用要查询的卷上的对象,然后查询该卷。

     

决定使用哪种查询类型

     

要使用的查询类型取决于存储的内容。如果您根据应用程序需要正常运行的用户请求或资源来存储数据(例如,用户即将观看的视频或游戏中下一级所需的资源),请查询{{1 }}。但是,如果您以更具预测性的方式下载数据(例如,下载用户最近一直在观看的电视剧的新可用剧集),请查询volumeAvailableCapacityForImportantUsageKey

     

构建查询

     

使用此示例作为构建您自己的查询的指南:

volumeAvailableCapacityForOpportunisticUsageKey

答案 1 :(得分:3)

我在带有iOS 6.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中的预留空间。但这只是在猜测。

答案 2 :(得分:2)

Another question昨天发布的帖子因为这个副本而被关闭了,而且这个证明了另一种可能导致错误的方法。

提问者做的是:

uint64_t freeSpace = (uint64_t)[fileSystemAttributes objectForKey:NSFileSystemFreeSize];

NSLog(@"Free space in bytes: %lld.",freeSpace);

他们将对象本身(更确切地说,对象在内存中的地址)视为可用字节数。这是错的;该对象是一个NSNumber对象,它包装了这样一个数字。正确的代码会询问对象的unsignedLongLongValue,它的类型正确,因此大到足以保存正确的值。

答案 3 :(得分:-1)

我敢打赌你使用的是32位整数或浮点类型来存储你的文件系统大小值。如果文件大小足够大,则会失败。相反,使用无符号long long或long double类型来存储这些值。

有关如何准确读取这些文件大小的信息,请参阅this answer的更正版本。对该答案和其他答案的评论表明,这将返回一个与iTunes和其他工具报告的免费大小相匹配的值。