#swift #macos #diskarbitration
#быстрый #macos #diskarbitration
Вопрос:
Я пытаюсь выяснить, как я могу получить некоторые дополнительные свойства диска в macOS с помощью Swift. Меня особенно интересует тип диска (например, SSD, HDD, Оптический).
Я получаю список подключенных томов, используя следующий код:
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?
Ответ №1:
Вы довольно близки, есть 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 в IOKit
.
Комментарии:
1. Спасибо, это должно быть хорошей отправной точкой.
2. Как мы можем получить URL-адреса всех томов, например, «mountedVolumeURLs» на C .