You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:17:50