Как отличить жесткие диски USB и SSD от USB-ключей / флеш-накопителей в macOS
Каким образом код может отличать внешние жесткие диски USB и твердотельные накопители, с одной стороны, от USB-накопителей, с другой стороны?
Я не знаком с API-интерфейсами macOS (или системными вызовами, прерываниями, обменом сообщениями и другими вещами), но я предполагаю, что это будет в наборе ввода-вывода или дисковом арбитраже?
В командной строке Терминала вы можете использовать system_profiler SPUSBDataType
эту информацию, указанную в разделе «Съемные носители».
Ответы
Вы можете получить съемную / извлекаемую информацию прямо из URL-адреса, извлекаемой информации достаточно для различения
let mountedVolumeURLs = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: [.nameKey, .volumeIsEjectableKey])!
for volumeURL in mountedVolumeURLs where volumeURL.path == "/" || volumeURL.path.hasPrefix("/Volumes") {
let resources = try! volumeURL.resourceValues(forKeys: [.nameKey, .volumeIsEjectableKey])
let ejectable = resources.volumeIsEjectable!
let name = resources.name!
var type = name + " is "
type += ejectable ? "USB stick, SD card, etc" : "hard drive, SSD, etc";
type += " ("
type += ejectable ? "" : "not "
type += "ejectable)"
print(" ", type)
}
Я никогда раньше не писал код для macOS или Swift. Я узнал достаточно, чтобы собрать это доказательство концепции. Это только двустороннее обобщение, как в моем вопросе: съемные и / или извлекаемые носители против несъемных неизвлекаемых носителей. DMG объединены с USB-накопителями и SD-картами. Оптические и гибкие диски тоже обязательно есть. Я понятия не имею, есть ли такая вещь, как тип хранилища, в котором истинно только одно из «съемный» и «извлекаемый», но не оба вместе ...
import Cocoa
import 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),
let bsdName = DADiskGetBSDName(disk) {
let bsdString = String(cString : bsdName)
print(volumeURL.path, bsdString)
if let descDict = DADiskCopyDescription(disk) as? [String: CFTypeRef] {
let removable : Bool, ejectable : Bool
if let val = descDict["DAMediaRemovable"] as? Bool {
removable = val
if let val = descDict["DAMediaEjectable"] as? Bool {
ejectable = val
var type = ""
type += removable || ejectable ? "USB stick, SD card, etc" : "hard drive, SSD, etc";
type += " ("
type += removable ? "" : "not "
type += "removable"
type += ", "
type += ejectable ? "" : "not "
type += "ejectable"
type += ")"
print(" ", type)
}
}
}
print("\n")
}
}
}