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

use*_*079 3 storage ios

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

NSDictionary *dict = [[NSFileManager defaultManager] fileSystemAttributesAtPath:@"/var"];
NSNumber *freeSpace = [dict valueForKey:@"NSFileSystemFreeSize"];
Run Code Online (Sandbox Code Playgroud)

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

这是为什么?如何获得与“设置”显示的值相同的值?

pwc*_*pwc 6

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

\n
    \n
  • static let volumeAvailableCapacityKey: URLResourceKey\n卷\xe2\x80\x99s 可用容量的键(以字节为单位)(只读)。

    \n
  • \n
  • static let volumeAvailableCapacityForImportantUsageKey: URLResourceKey\n卷的键\xe2\x80\x99s 用于存储重要资源的可用容量(以字节为单位)(只读)。

    \n
  • \n
  • static let volumeAvailableCapacityForOpportunisticUsageKey: URLResourceKey\n卷\xe2\x80\x99s 用于存储非必需资源的可用容量(以字节为单位)的键(只读)。

    \n
  • \n
  • static let volumeTotalCapacityKey: URLResourceKey\n卷\xe2\x80\x99s 总容量的键(以字节为单位)(只读)。

    \n
  • \n
\n

来自苹果的文档

\n
\n

概述

\n

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

\n

决定使用哪种查询类型

\n

使用的查询类型取决于存储的内容。如果您\xe2\x80\x99根据用户请求或应用程序正常运行所需的资源存储数据(例如,用户将要观看的视频或游戏中下一个级别所需的资源),请查询反对volumeAvailableCapacityForImportantUsageKey。但是,如果您\xe2\x80\x99 以更具预测性的方式下载数据(例如,下载用户最近观看过的电视剧的新剧集),请查询volumeAvailableCapacityForOpportunisticUsageKey.

\n

构造一个查询

\n

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

\n
\n
let fileURL = URL(fileURLWithPath:"/")\ndo {\n    let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey])\n    if let capacity = values.volumeAvailableCapacityForImportantUsage {\n        print("Available capacity for important usage: \\(capacity)")\n    } else {\n        print("Capacity is unavailable")\n    }\n} catch {\n    print("Error retrieving capacity: \\(error.localizedDescription)")\n}\n
Run Code Online (Sandbox Code Playgroud)\n