以下是我用来为我的应用获取iOS设备上的可用存储空间的内容:
NSDictionary *dict = [[NSFileManager defaultManager] fileSystemAttributesAtPath:@"/var"];
NSNumber *freeSpace = [dict valueForKey:@"NSFileSystemFreeSize"];
但是,值freeSpace
与“设置”应用中显示的值不对应。该值始终大于“设置”显示的值。例如,freeSpace
大约为600,000,000字节,其中“设置”显示357 MB。
为什么会这样,我如何获得与设置显示的值相同的值?
答案 0 :(得分:4)
在iOS 11下,有新的音量容量键可以传递给URL.resourceValues(forKeys:)
,提供的值与设备设置中的值相匹配。
static let volumeAvailableCapacityKey: URLResourceKey
卷的可用容量的密钥(以字节为单位)(只读)。
static let volumeAvailableCapacityForImportantUsageKey: URLResourceKey
用于存储重要资源的卷的可用容量(以字节为单位)的密钥(只读)。
static let volumeAvailableCapacityForOpportunisticUsageKey: URLResourceKey
用于存储非必要资源的卷的可用容量(以字节为单位)的密钥(只读)。
static let volumeTotalCapacityKey: URLResourceKey
卷的总容量的密钥(以字节为单位)(只读)。
概述
在尝试在本地存储大量数据之前,请先验证您是否有足够的存储容量。要获取卷的存储容量,请构造一个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和其他工具报告的免费大小相匹配的值。