匹配High Sierra系统MacOS磁盘工具可用空间的API/算法选择
关于Disk Utility与Swift磁盘空间API结果不一致的疑问
我最近基于苹果开发者文档写了一段Swift代码,用来查询磁盘的存储容量。大部分测试场景下,代码返回的结果和系统自带的Disk Utility(磁盘工具)是匹配的,但偶然会出现不统一的情况——比如前阵子我删除并清空了废纸篓里一个100GB的VMWare Fusion虚拟机文件,哪怕重启了电脑,磁盘工具显示的可用空间还是没更新,可通过DiskArbitration API拿到的数据已经同步了变化。
当时的具体数据对比:
- Disk Utility显示可用空间为 41.45GB
- 我的代码输出如下:
Available capacity: 115.6 GB Available capacity for important usage: 149.2 GB Available capacity for opportunistic usage: 136.8 GB Total Capacity: 250.7 GB Program ended with exit code: 0
我现在想搞清楚:Disk Utility计算可用空间的逻辑是什么?它底层调用的是哪个API?
以下是我的示例代码:
import Foundation import DiskArbitration func deviceRemainingFreeSpaceInBytes() -> Int64? { let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! guard let systemAttributes = try? FileManager.default.attributesOfFileSystem(forPath: documentDirectory), let freeSize = systemAttributes[.systemFreeSize] as? NSNumber else { // something failed return nil } return freeSize.int64Value } let fileURL = URL(fileURLWithPath:"/") do { let formatter = ByteCountFormatter(); let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey,.volumeAvailableCapacityKey,.volumeAvailableCapacityForOpportunisticUsageKey,.volumeTotalCapacityKey]) if let AvailableCapacity = values.volumeAvailableCapacity { print("Available capacity: \(formatter.string(fromByteCount:Int64(AvailableCapacity)))") } else { print("Capacity is unavailable") } if let bytes = deviceRemainingFreeSpaceInBytes() { print("Free Space on System: \(formatter.string(fromByteCount:bytes))") } else { print("failed") } if let AvailableCapacityForImportantUsage = values.volumeAvailableCapacityForImportantUsage { print("Available capacity for important usage: \(formatter.string(fromByteCount:AvailableCapacityForImportantUsage))") } else { print("Capacity is unavailable") } if let AvailableCapacityForOpportunisticUsage = values.volumeAvailableCapacityForOpportunisticUsage { print("Available capacity for opportunistic usage: \(formatter.string(fromByteCount:AvailableCapacityForOpportunisticUsage))") } else { print("Capacity is unavailable") } if let TotalCapacity = values.volumeTotalCapacity { print("Total Capacity: \(formatter.string(fromByteCount:Int64(TotalCapacity)))") } else { print("Capacity is unavailable") } } catch { print("Error retrieving capacity: \(error.localizedDescription)") }
内容的提问来源于stack exchange,提问作者Malcolm McCaffery
相关产品推荐
相关产品推荐

