我正在尝试使用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“。我想获取有关此磁盘的其他信息。如果我看一下Disk Utility,disk0似乎没有做太多事情,所以我想要获得disk0的所有“子”卷。我尝试收集所有磁盘,剪切"disk“,然后解析剩余的编号。有时这是可行的(如果disk1有子卷disk1s1和disk1s2),但有时有一个根磁盘(让我们称它为disk2),并且有一个(虚拟?)容器。在这个容器下面,还有称为disk3和disk3s1的额外磁盘(这就是我的方法失败的地方)。
我已经尝试使用IOKit,它打印所有的磁盘名称。然而,我不知道如何构建树状结构(我想我可以根据路径修改一些东西):
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)
}有没有一种可靠的方法可以在某种层次结构中获得主磁盘及其所有卷?
发布于 2021-06-26 03:22:58
我设法用一种老套但目前对沙盒不是很友好的方式做了一个类似的结构(它可以是对沙盒友好的,继续阅读以获取更多信息)。
这都是基于这样一个事实:当您执行以下终端命令时,diskutil命令实际上返回了一个树状结构,其中包含您可能需要的关于系统中存在的磁盘的所有详细信息: diskutil list -plist
因此,为了在我的代码中使用它来获取磁盘树结构,我执行了以下操作:
中。
复制-粘贴这里的所有代码会造成很多混乱(这是很多代码),我更喜欢链接到我在开源项目中完成大部分工作的快速文件:https://github.com/ITzTravelInTime/TINU/blob/development/TINU/DiskutilListCodable.swift
老实说,我不知道Diskutil可执行文件使用哪种黑魔法来收集这些信息并生成三个结构,但现在这是我发现的收集这些信息的最容易的方法,我知道一些开发人员(比如一些EFI分区/ESP安装工具的开发人员)已经使用系统API成功地完成了这一点,但我不知道是如何做到的。
https://stackoverflow.com/questions/65293101
复制相似问题