在不使用 diskutil CLI 包装器的情况下获取所有 USB 设备(可能还包括内部 Mac 驱动器)的 BSD 名称列表的最佳方法是什么?
我不想使用任何与 CLI 界面交互的包装器,因为这种交互方式非常慢并且< b>不可靠:
这是我对使用 CLI 包装器不满意的示例
(比较“DiskUtil CLI Wrapper 所用时间”。 和“磁盘仲裁所用时间”)
实现解决我的问题的最佳方法是什么?
使用IOReg中的数据?
如果是,我如何获取使用它的连接设备的 BSD 名称列表?
这是我想要得到的示例:
["disk0", "disk0s1", "disk0s2", "disk0s3", "disk1", "disk1s1", "disk1s2", "disk1s3", "disk1s4", "disk2", "disk2s1", "disk2s2", "disk3", "disk3s1", "disk3s1s1", "disk3s2", "disk3s3", "disk3s4", "disk3s5", "disk3s6", "disk4", "disk4s1", "disk4s2", "disk5", "disk5s1", "disk5s2", "disk6", "disk6s1", "disk6s2", "disk10", "disk10s1", "disk10s2", "disk11", "disk11s1"]
目前,我有以下内容:
static func getMountedBSDNames() -> [String] {
guard let session = DASessionCreate(nil) else { return [] }
guard let mountedVolumeURLs = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil) else { return [] }
var BSDNames: [String] = []
for volumeURL in mountedVolumeURLs {
if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volumeURL as CFURL), let BSDName = DADiskGetBSDName(disk) {
BSDNames.append(
String(cString: BSDName)
)
}
}
return BSDNames
}
但在这种情况下,仅返回已安装的。
我希望那里甚至还有那些被拒绝的
最佳答案
我使用 IOReg 查找方法达到了预期的结果:
func getDriveBSDNames() -> [String] {
var iterator: io_iterator_t = 0
let matching: CFDictionary = IOServiceMatching(kIOServicePlane)
// Use 'kIOMasterPortDefault' for macOS older than 12.0 Monterey
IOServiceGetMatchingServices(kIOMainPortDefault, matching, &iterator)
var child: io_object_t = IOIteratorNext(iterator)
var BSDNames: [String] = []
while child > 0 {
if let BSDNameAnyObject = IORegistryEntryCreateCFProperty(child, "BSD Name" as CFString, kCFAllocatorDefault, IOOptionBits(kIORegistryIterateRecursively)) {
if let BSDNameString = (BSDNameAnyObject.takeRetainedValue() as? String), BSDNameString.starts(with: "disk") {
BSDNames.append(
BSDNameString
)
}
}
child = IOIteratorNext(iterator)
}
return BSDNames
}
在这种情况下,还需要使用以下方法过滤结果的输出:
BSDNameString.starts(with: "disk")
(否则添加了一些不必要的设备,如en0、anpi0、llw0等)
关于swift - 在 macOS (Swift) 上获取 BSD 驱动器名称的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74164719/