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

匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:05:01