swift 卷机会可用容量差异太大且太低

ykejflvf  于 2023-06-28  发布在  Swift
关注(0)|答案(1)|浏览(91)

我试图弄清楚我的iPhone设备上还有多少可用空间,但即使它有足够的存储空间(超过40GB),它也会将Volume机会可用容量返回到零(0),有时甚至小于20MB。我不知道它是如何计算机会可用容量的,但我希望使用它,因为我认为使用它比使用Volume重要的可用容量更安全。即使在iPhone存储效率很高的情况下,也有可能返回如此低的数字吗?

let freeSpace: CGFloat = {
            let fileURL = URL(fileURLWithPath: NSHomeDirectory() as String)
            do {
                let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForOpportunisticUsageKey])
                if let capacity = values.volumeAvailableCapacityForOpportunisticUsage {
                    return CGFloat(capacity)
                } else {
                    return 0
                }
            } catch {
                return 0
            }
        }()

我想知道为什么机会可用容量与重要可用容量有如此大的不同。

guz6ccqo

guz6ccqo1#

机会可用容量和重要可用容量之间的报告值的差异可能是由于与iOS如何管理设备上的存储有关的各种因素。
机会可用容量表示当前可用于机会任务(如缓存和临时数据)的存储量。它考虑了可以临时使用的空间,并且可以理解,如果需要,它可以由系统回收。此值可以根据系统条件和资源需求而波动。
另一方面,重要可用容量表示可用于关键数据的存储量,例如用户生成的内容或基本应用程序功能。此值通常更保守,并考虑了长期存储需求和系统稳定性。
要获得设备上剩余的真实的存储量,您需要访问文件管理器文档目录路径:

enum StorageCapacityError: Error {
    case unavailable
}

func getAvailableStorageCapacity() throws -> Result<UInt64, Error> {
    let fileManager = FileManager.default
    let documentDirectoryURL = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    
    do {
        let attributes = try fileManager.attributesOfFileSystem(forPath: documentDirectoryURL.path)
        if let freeSize = attributes[.systemFreeSize] as? NSNumber {
            return .success(freeSize.uint64Value)
        } else {
            return .failure(StorageCapacityError.unavailable)
        }
    } catch {
        return .failure(error)
    }
}

相关问题