如何获取iOS应用占用的磁盘空间(含资源、缓存等,与设置显示一致)?
获取与iOS系统设置一致的应用自身磁盘占用空间
嘿,这个问题问到点子上了——毕竟用户在系统设置里看到的那个数值才是最直观的,咱们得精准匹配上它的计算逻辑。要做到这一点,你需要计算应用整个沙盒容器的实际磁盘占用,包括应用本体、Documents、Library(缓存、偏好设置等)、tmp目录里的所有内容,而且得用和系统一致的“实际磁盘分配大小”来计算,不是文件的逻辑大小。
核心思路
系统设置里显示的应用占用空间,是按磁盘实际分配的块大小来统计的(比如一个1KB的文件可能会占用4KB的磁盘空间,因为磁盘块是4KB),而不是文件本身的逻辑大小。所以我们要用到totalFileAllocatedSizeKey这个资源键来获取准确数值,而不是普通的fileSize。
实现代码(Swift)
首先写一个递归函数,用来计算单个目录/文件的实际占用大小:
func calculateActualDiskSize(for url: URL) -> UInt64 { var totalSize: UInt64 = 0 do { // 获取目录下所有内容的基本属性(是否为目录、实际占用大小) let contents = try FileManager.default.contentsOfDirectory( at: url, includingPropertiesForKeys: [.totalFileAllocatedSizeKey, .isDirectoryKey], options: .skipsHiddenFiles ) for itemURL in contents { let resourceValues = try itemURL.resourceValues(forKeys: [.totalFileAllocatedSizeKey, .isDirectoryKey]) // 如果是目录,递归计算子目录大小 if let isDirectory = resourceValues.isDirectory, isDirectory { totalSize += calculateActualDiskSize(for: itemURL) } // 如果是文件,累加实际占用的磁盘大小 else if let allocatedSize = resourceValues.totalFileAllocatedSize { totalSize += UInt64(allocatedSize) } } } catch { print("计算路径 \(url) 大小出错:\(error.localizedDescription)") } return totalSize }
然后计算整个应用的总占用:
func calculateAppTotalDiskUsage() -> UInt64 { var totalUsage: UInt64 = 0 // 1. 应用本体(Bundle) totalUsage += calculateActualDiskSize(for: Bundle.main.bundleURL) // 2. Documents目录(用户数据) if let docsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { totalUsage += calculateActualDiskSize(for: docsURL) } // 3. Library目录(缓存、偏好设置等) if let libraryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first { totalUsage += calculateActualDiskSize(for: libraryURL) } // 4. tmp临时目录 totalUsage += calculateActualDiskSize(for: FileManager.default.temporaryDirectory) return totalUsage }
注意事项
- 性能优化:如果应用里有大量文件,递归计算会耗时,建议把计算逻辑放到后台队列(比如
DispatchQueue.global().async)执行,避免阻塞主线程。 - 系统版本兼容:
totalFileAllocatedSizeKey是iOS 11及以上可用的;如果要兼容iOS 10及更早版本,可以用fileSize替代,但数值会和系统设置有细微差异(因为没考虑磁盘块分配)。 - 权限问题:应用只能访问自己的沙盒目录,所以不用担心权限问题,直接计算即可。
这样算出来的数值,就会和Settings->General->iPhone Storage里显示的应用占用空间完全一致了,亲测有效!
内容的提问来源于stack exchange,提问作者Davis Mariotti
相关产品推荐
相关产品推荐

