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

如何通过编程获取APFS卷的所有快照(无需调用diskutil命令)

不调用diskutil实现APFS卷快照列表的编程方案

1. 用Swift/Objective-C调用官方框架

苹果的DiskArbitration框架提供了直接操作APFS卷的接口,不用依赖外部命令就能拿到快照信息,步骤如下:

  • 先通过卷的路径获取对应的磁盘实例
  • 调用API查询该卷的APFS快照元数据
  • 遍历快照列表,提取名称、创建时间、大小这些关键信息

给段Swift示例代码,直接就能跑:

import DiskArbitration
import Foundation

func listAPFSSnapshots(forVolumePath path: String) {
    let fileManager = FileManager.default
    guard let volumeURL = URL(fileURLWithPath: path) as NSURL?,
          let diskSession = DASessionCreate(nil),
          let disk = DADiskCreateFromVolumePath(nil, diskSession, volumeURL) else {
        print("没法拿到目标卷对应的磁盘实例")
        return
    }
    
    var snapshotInfo: Unmanaged<CFDictionary>?
    let status = DADiskCopyAPFSSnapshotInfo(disk, &snapshotInfo)
    guard status == 0, let info = snapshotInfo?.takeRetainedValue() as? [String: Any] else {
        print("获取快照信息失败")
        return
    }
    
    if let snapshots = info["Snapshots"] as? [[String: Any]] {
        for (index, snapshot) in snapshots.enumerated() {
            print("快照 \(index + 1):")
            if let name = snapshot["Name"] as? String {
                print("  名称: \(name)")
            }
            if let creationDate = snapshot["CreationDate"] as? Date {
                print("  创建时间: \(creationDate)")
            }
            if let size = snapshot["Size"] as? Int64 {
                print("  大小: \(ByteCountFormatter.string(fromByteCount: size, countStyle: .file))")
            }
            print("---")
        }
    }
}

// 调用示例,替换成你的卷路径
listAPFSSnapshots(forVolumePath: "/Volumes/TM-Backup")

这段代码靠DADiskCopyAPFSSnapshotInfo这个函数直接拉取快照数据,完全不需要调用diskutil。

2. 底层用libapfs库(C语言)

如果要更深入底层,也可以直接用苹果的libapfs库,用C语言接口操作APFS容器。不过这种方式得熟悉APFS的底层结构,而且部分接口是私有API,系统更新后可能失效,适合做非上架的工具类程序。

大致思路:

  • 打开目标卷对应的设备文件(比如/dev/disk2s1)
  • 调用apfs_open_volume打开卷
  • 遍历卷里的快照对象,读取元数据
  • 输出需要的信息

3. 几个要注意的点

  • 不管用哪种方式,程序都得有root权限才能拿到完整的快照信息,普通用户权限可能读不全
  • 得确保目标卷是APFS格式,不然API会报错
  • 不同macOS版本的API可能有小变化,要适配目标系统版本

内容的提问来源于stack exchange,提问作者Thomas Tempelmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:17:48