swift - 在 macOS (Swift) 上获取 BSD 驱动器名称的最佳方法是什么?

标签 swift macos cocoa iokit diskarbitration

在不使用 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/

相关文章:

ios - 搜索栏从 iPhone 上的“搜索”按钮展开

swift - 错误 - 条件中的变量绑定(bind)需要初始值设定项

macos - Linux/dev/input对应的Mac低级键盘设备?

objective-c - Cocoa - Webkit.framework 的替代品?

ios - 如何使用快速枚举修改 NSArray 的字符串元素?

ios - 如何使用 SwiftUI 隐藏 home 指示器?

macos - OSX WebView 非常慢且滞后

c++ - 将 QuickTime 音频复制到另一个 QuickTime 影片

c# - 如何在 NSGridView 或 NSTableView 中跨列

swift 4 : Detecting strongest frequency or presence of frequency in audio stream.