2

一方面,代码如何区分外部 USB 硬盘驱动器和固态驱动器与另一方面的 USB 记忆棒?

我不熟悉 macOS API(或系统调用、中断、消息传递和其他东西),但我猜它会在 I/O Kit 或磁盘仲裁中?

在终端命令行上,您可以使用system_profiler SPUSBDataType并查看“可移动媒体”下列出的此信息。

4

2 回答 2

2

您可以直接从 URL 中获取可移除/可弹出信息,可弹出足以区分

let mountedVolumeURLs = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: [.nameKey, .volumeIsEjectableKey])!
for volumeURL in mountedVolumeURLs where volumeURL.path == "/" || volumeURL.path.hasPrefix("/Volumes") {
    let resources = try! volumeURL.resourceValues(forKeys: [.nameKey, .volumeIsEjectableKey])
    
    let ejectable = resources.volumeIsEjectable!
    let name = resources.name!
    
    var type = name + " is "
    type += ejectable ? "USB stick, SD card, etc" : "hard drive, SSD, etc";
    type += " ("
    type += ejectable ? "" : "not "
    type += "ejectable)"
    print(" ", type)
}
于 2020-12-15T08:19:12.457 回答
1

我以前从未编写过 macOS 或 Swift 代码。我学到的东西刚好够把这个概念证明放在一起。它只会像我的问题那样进行双向概括:可移动和/或可弹出媒体与不可移动不可弹出媒体。DMG 与 U 盘和 SD 卡混为一谈。光盘和软盘当然也是。我不知道是否存在存储类型之类的东西,其中只有“可移动”和“可弹出”中的一个为真,但不是两者都为真......

import Cocoa
import DiskArbitration

if let session = DASessionCreate(kCFAllocatorDefault) {
    let mountedVolumeURLs = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil)!
    for volumeURL in mountedVolumeURLs {
        if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volumeURL as CFURL),
            let bsdName = DADiskGetBSDName(disk) {
            let bsdString = String(cString : bsdName)
            print(volumeURL.path, bsdString)
            
            if let descDict = DADiskCopyDescription(disk) as? [String: CFTypeRef] {
                let removable : Bool, ejectable : Bool
                if let val = descDict["DAMediaRemovable"] as? Bool {
                    removable = val
                    if let val = descDict["DAMediaEjectable"] as? Bool {
                        ejectable = val

                        var type = ""
                        
                        type += removable || ejectable ? "USB stick, SD card, etc" : "hard drive, SSD, etc";
                        
                        type += " ("
                        
                        type += removable ? "" : "not "
                        type += "removable"
                        type += ", "
                        type += ejectable ? "" : "not "
                        type += "ejectable"
                        
                        type += ")"

                        print(" ", type)
                    }
                }
            }
            print("\n")
        }
    }
}
于 2020-12-14T12:19:23.833 回答