获取磁盘 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,而是使用 NSURLresourceValuesForKeys: 方法来免费获得您的驱动器 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 概念导致它缺乏读取这些值的设施。