获取磁盘 Space 属性 NSFileSystem +attributesOfFileSystem 与 iOS 设置应用程序中的信息不匹配
Getting Disk Space Attributes NSFileSystem +attributesOfFileSystem doesn't match info in iOS Settings App
我正在尝试从我的 iOS 应用程序中获取总计/已用/免费 space 字节,使用以下代码,改编自本网站上的各种解决方案。
- (unsigned long long)totalDiskSpace {
unsigned long long space = 0;
NSError *error = nil;
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:paths.lastObject error:&error];
if (dict) {
NSNumber *size = dict[NSFileSystemSize];
space = size.unsignedLongLongValue;
}
return space;
}
- (unsigned long long)freeDiskSpace {
unsigned long long space = 0;
NSError *error = nil;
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:paths.lastObject error:&error];
if (dict) {
NSNumber *size = dict[NSFileSystemFreeSize];
space = size.unsignedLongLongValue;
}
return space;
}
问题是,当我将这些值与用户在 Settings.app 中可能看到的值进行比较时,它们完全不对 我正在 256 GB iPhone X 上进行测试,虽然"total" space 值是正确的,"free" space 的值似乎比应有的值小很多。
在我的设备上,我得到的值是 255937040384
(~255GB),但只有 175536754688
是免费的,也就是说 80400285696
已用 (~80GB)。但是,在 Settings.app 中,我的设备显示仅使用了 52.4 GB。
有人知道为什么会这样吗?
不要使用 NSFileManager
,而是使用 NSURL
的 resourceValuesForKeys:
方法来免费获得您的驱动器 space。 NSURL
在这里提供了三个相关常量:
NSURLVolumeAvailableCapacityKey
——你的驱动器上的文字 free space,应该与 NSFileManager
、
[= 返回的值相同35=]
NSURLVolumeAvailableCapacityForImportantUsageKey
—驱动器上的字面量 space,加上磁盘上任何 "ephemeral" 文件的大小,如果需要可以自动删除为其他事情提供空间,并且:
NSURLVolumeAvailableCapacityForOpportunisticUsageKey
—临时文件本身可用的 space 数量,根据我的经验,这通常少于实际免费 space。
在您的情况下,NSURLVolumeAvailableCapacityForImportantUsageKey
可能是 Settings.app 报告的值,因为从用户的角度来看,这是您必须使用的 space 的数量。
此外,作为一般规则,如果您使用的是采用路径而不是 URL 的 Apple Objective-C 或 Swift API,则可能是遗产 API。 URL-based API 通常更完整 up-to-date,通常比 path-based 更受青睐——在这种情况下,path-based API 早于 Important/Opportunistic 概念导致它缺乏读取这些值的设施。
我正在尝试从我的 iOS 应用程序中获取总计/已用/免费 space 字节,使用以下代码,改编自本网站上的各种解决方案。
- (unsigned long long)totalDiskSpace {
unsigned long long space = 0;
NSError *error = nil;
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:paths.lastObject error:&error];
if (dict) {
NSNumber *size = dict[NSFileSystemSize];
space = size.unsignedLongLongValue;
}
return space;
}
- (unsigned long long)freeDiskSpace {
unsigned long long space = 0;
NSError *error = nil;
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:paths.lastObject error:&error];
if (dict) {
NSNumber *size = dict[NSFileSystemFreeSize];
space = size.unsignedLongLongValue;
}
return space;
}
问题是,当我将这些值与用户在 Settings.app 中可能看到的值进行比较时,它们完全不对 我正在 256 GB iPhone X 上进行测试,虽然"total" space 值是正确的,"free" space 的值似乎比应有的值小很多。
在我的设备上,我得到的值是 255937040384
(~255GB),但只有 175536754688
是免费的,也就是说 80400285696
已用 (~80GB)。但是,在 Settings.app 中,我的设备显示仅使用了 52.4 GB。
有人知道为什么会这样吗?
不要使用 NSFileManager
,而是使用 NSURL
的 resourceValuesForKeys:
方法来免费获得您的驱动器 space。 NSURL
在这里提供了三个相关常量:
[= 返回的值相同35=]NSURLVolumeAvailableCapacityKey
——你的驱动器上的文字 free space,应该与NSFileManager
、NSURLVolumeAvailableCapacityForImportantUsageKey
—驱动器上的字面量 space,加上磁盘上任何 "ephemeral" 文件的大小,如果需要可以自动删除为其他事情提供空间,并且:NSURLVolumeAvailableCapacityForOpportunisticUsageKey
—临时文件本身可用的 space 数量,根据我的经验,这通常少于实际免费 space。
在您的情况下,NSURLVolumeAvailableCapacityForImportantUsageKey
可能是 Settings.app 报告的值,因为从用户的角度来看,这是您必须使用的 space 的数量。
此外,作为一般规则,如果您使用的是采用路径而不是 URL 的 Apple Objective-C 或 Swift API,则可能是遗产 API。 URL-based API 通常更完整 up-to-date,通常比 path-based 更受青睐——在这种情况下,path-based API 早于 Important/Opportunistic 概念导致它缺乏读取这些值的设施。