swift - 如何使用 DiskArbitration 或其他框架在 macOS 上获取磁盘类型(SSD、HDD、Optical)
问题描述
我试图弄清楚如何使用 Swift 在 macOS 上获得一些额外的磁盘属性。我对磁盘的类型(如 SSD、HDD、Optical)特别感兴趣。
我正在使用以下代码获取已安装卷的列表:
FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil)
然后,我将遍历所有卷并使用属性键获取其他属性,例如总磁盘空间:
for volumeUrl in mountedVolumeURLs {
if let values = try? volumeUrl.resourceValues(forKeys: [.volumeTotalCapacityKey, .volumeNameKey, .volumeIsInternalKey] {
// Do something
}
}
我找不到获取类型的资源键。然后我看到还有一个名为DiskArbitration
.
我曾经使用以下代码来获取 BSD 名称,希望使用 IOReg 找到类型,但这也对我没有帮助(我只使用此代码来获取坏名称,我认为 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)
{
if let bsdname = DADiskGetBSDName(disk)
{
let bsdString = String(cString : bsdname)
print(volumeURL.path, bsdString)
}
}
}
}
是否可以使用 macOS 上的(公共)框架获取此信息?
解决方案
您非常接近,有一个 API可以返回包含大量信息的DADiskCopyDescription
字典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)
{
if let diskInfo = DADiskCopyDescription(disk) as? [String:Any]
{
print(volumeURL.path, diskInfo)
}
}
}
}
但据我所知,它没有显示磁盘是 SSD 还是 HD 的信息,这可以通过 .IORegistry 中的 IORegistry 来确定IOKit
。
推荐阅读
- bash - Bash - 用`set`恢复位置参数有什么意义?
- r - 编写一个 for 循环以最小化模糊匹配中的计算
- excel - 如何将 Excel Solver 与 IF 语句一起使用?
- ios - 如何从代表的集合视图单元格中获取 indexPath 项?
- phpspreadsheet - 使用 PhpSpreadsheet 设置电子表格单元格的宽度(像素)
- esp8266 - 当互联网连接从 esp8266 (Nodemcu) 重新连接时,从 .json 文件发送数据集合
- javascript - Spring MVC - 从控制器发布到不同的 url
- python - 从 python 的列表中删除值 / nan / 空字符串(“”)
- php - 如何在 WooCommerce /my-account/downloads/ 中的下载表中添加一列
- scala - 为什么 scala-swing Button 可以分配给 MainFrame 的内容?