Как получить тип диска (SSD, HDD, оптический) на macOS с помощью DiskArbitration или другого фреймворка

#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 .