首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DiskArbitration和IOKit获取所有卷的树状结构

使用DiskArbitration和IOKit获取所有卷的树状结构
EN

Stack Overflow用户
提问于 2020-12-15 00:55:04
回答 1查看 81关注 0票数 2

我正在尝试使用Swift获得我的计算机的所有卷的树状结构。

获取所有已挂载卷的最简单方法是以下代码:

FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil)

使用此URL,我可以创建一个DADisk对象来获取BSD名称:

代码语言:javascript
复制
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,它打印所有的磁盘名称。然而,我不知道如何构建树状结构(我想我可以根据路径修改一些东西):

代码语言:javascript
复制
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)
}

有没有一种可靠的方法可以在某种层次结构中获得主磁盘及其所有卷?

EN

回答 1

Stack Overflow用户

发布于 2021-06-26 03:22:58

我设法用一种老套但目前对沙盒不是很友好的方式做了一个类似的结构(它可以是对沙盒友好的,继续阅读以获取更多信息)。

这都是基于这样一个事实:当您执行以下终端命令时,diskutil命令实际上返回了一个树状结构,其中包含您可能需要的关于系统中存在的磁盘的所有详细信息: diskutil list -plist

因此,为了在我的代码中使用它来获取磁盘树结构,我执行了以下操作:

  1. 我使用一个进程对象实现了一个函数,将"diskutil list -plist“的输出以字符串的形式返回给我(据我所知,如果你想让你的应用程序沙箱友好,这部分代码需要放在一个需要嵌入到你的应用程序捆绑包中的辅助工具中)

  1. 我创建了一些可编码的结构和一些相应的协议,以便以最小的工作量对plist字符串进行反序列化

  1. 我让我的代码在结构上执行一些操作,以便更容易地处理一些东西,比如将与其物理设备相关联的APFS容器放入树状结构

中。

复制-粘贴这里的所有代码会造成很多混乱(这是很多代码),我更喜欢链接到我在开源项目中完成大部分工作的快速文件:https://github.com/ITzTravelInTime/TINU/blob/development/TINU/DiskutilListCodable.swift

老实说,我不知道Diskutil可执行文件使用哪种黑魔法来收集这些信息并生成三个结构,但现在这是我发现的收集这些信息的最容易的方法,我知道一些开发人员(比如一些EFI分区/ESP安装工具的开发人员)已经使用系统API成功地完成了这一点,但我不知道是如何做到的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65293101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档