我正在尝试使用 Swift 获得我计算机所有卷的树状结构。
获取所有已安装卷的最简单方法是以下代码:
FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil)
使用它URL
,我可以创建一个DADisk
对象来获取 BSD 名称:
if let session = DASessionCreate(kCFAllocatorDefault) {
if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, url as CFURL) {
if let bsdName = DADiskGetBSDName(disk) {
volume.bsdName = String(cString : bsdName) // Volume is my own class.
}
}
}
现在对于“主”磁盘,我得到“disk0”。我想获得有关此磁盘的更多信息。如果我看一下磁盘实用程序,disk0 似乎没有做太多,所以我想获取 disk0 的所有“子”卷。我试图收集所有磁盘,剪切“磁盘”,然后解析剩余编号。有时这可行(如果disk1 有子卷disk1s1 和disk1s2),但有时有一个根磁盘(我们称之为disk2)并且有一个(虚拟?)容器。在这个容器下面,还有额外的磁盘,称为 disk3 和 disk3s1(这是我的方法失败的地方)。
我尝试使用IOKit
which 打印所有磁盘名称。但是,我不知道如何构建树状结构(我想我可以根据路径破解一些东西):
var iterator: io_iterator_t = 0
let matching: CFDictionary = IOServiceMatching(kIOServicePlane)
IOServiceGetMatchingServices(kIOMasterPortDefault, matching, &iterator)
var child: io_object_t = IOIteratorNext(iterator)
while child != 0
{
if let bsdName = IORegistryEntryCreateCFProperty(child, self.bsdNameKey as CFString, kCFAllocatorDefault, IOOptionBits(kIORegistryIterateRecursively))
{
Swift.print(bsdName)
}
child = IOIteratorNext(iterator)
}
有没有一种可靠的方法可以在某种层次结构中获取主磁盘及其所有卷?