如何在 Swift 中获取磁盘标识符

Tod*_*odd 7 macos swift

我想找到附加驱动器的标识符 - 如终端命令中所示 diskutil list

   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS SSHD OSX                511.7 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:                  Apple_HFS SSHD OSX NEW            511.0 GB   disk0s4
   5:                 Apple_Boot Recovery HD             650.0 MB   disk0s5
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经设法编写了这段代码:

var volume_stack = [NSURL]()

volume_stack = NSFileManager.defaultManager().mountedVolumeURLsIncludingResourceValuesForKeys([NSURLVolumeNameKey, NSURLVolumeIdentifierKey], options: [])!
for disk: NSURL in volume_stack {
    do {
        var info: Dictionary = [String : AnyObject]()
        info = try disk.resourceValuesForKeys([NSURLVolumeIdentifierKey])
        for (key, value) in info {
            var s_value = String(data: value as! NSData, encoding: NSUTF8StringEncoding)
            print("key: \(key) value: \(s_value)")
        }
    }
    catch {
        print ("ERROR")
    }
}
Run Code Online (Sandbox Code Playgroud)

但输出是:

key: NSURLVolumeIdentifierKey value: Optional("gEd\0\0\0\0\0")
key: NSURLVolumeIdentifierKey value: nil
key: NSURLVolumeIdentifierKey value: nil
key: NSURLVolumeIdentifierKey value: Optional("sHg\0\0\0\0\0")
Run Code Online (Sandbox Code Playgroud)

ivar 的日志value而不是s_value给出

key: NSURLVolumeIdentifierKey value: <67456400 00000000>
key: NSURLVolumeIdentifierKey value: <c6236500 00000000>
key: NSURLVolumeIdentifierKey value: <69986600 00000000>
key: NSURLVolumeIdentifierKey value: <73486700 00000000>
Run Code Online (Sandbox Code Playgroud)

据我所知,它是NSData. 为写得不好的代码道歉,但这是我的第一个 Swift 应用程序,我一直在兜圈子,所以它变得有点不成熟。有没有办法获取标识符列中列出的内容作为String

vad*_*ian 6

DiskArbitration.framework

在较高级别,您可以使用磁盘仲裁框架来:

  • 接收磁盘相关事件的通知(例如磁盘弹出)并参与仲裁过程(例如防止磁盘弹出)。
  • 获取有关磁盘的信息并操作磁盘(例如,请求弹出磁盘)。

首先用 来创建一个全局会话DASessionCreate,然后DADiskCreateFromVolumePath为每个挂载的卷创建一个磁盘引用,并用来获取 BSD 名称(标识符)DADiskGetBSDName。将 C 字符串转换为String,您就完成了。

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种合适的方法是解析 IORegistry。