Как отличить жесткие диски USB и твердотельные накопители от USB-ключей / флеш-накопителей в macOS

Каким образом код может отличать внешние жесткие диски USB и твердотельные накопители, с одной стороны, от USB-накопителей, с другой стороны?

Я не знаком с API-интерфейсами macOS (или системными вызовами, прерываниями, обменом сообщениями и другими вещами), но я предполагаю, что это будет в I / O Kit или Disk Arbitration?

В командной строке терминала вы можете использовать system_profiler SPUSBDataType и просмотреть эту информацию в разделе «Съемные носители».


person hippietrail    schedule 11.12.2020    source источник
comment
Любой диск (ручка / жесткий диск / SSD), подключенный через USB, будет рассматриваться только как съемный диск. Вы можете попробовать проверить их размер и тип формата. Но я не думаю, что это поможет в том, что вы ищете.   -  person Ajay Kumar    schedule 12.12.2020
comment
@AjayKumar: Кажется, существует концепция съемных носителей. Когда я подключаю жесткий диск USB, USB-накопитель, USB-накопитель и SD-карту к USB-устройству чтения, system_profiler SPUSBDataType считает, что USB-накопитель и SD-карта являются съемными носителями, но не жестким диском или SSD, хотя все диски могут также быть удаленным. Я предполагаю, что это продолжение того, когда нужно отличать дисководы гибких дисков, компакт-дисков и DVD от жестких дисков. Я столкнулся с этим, используя кроссплатформенную библиотеку, которая исключает USB-накопители из списка дисков для Windows, но не для Mac.   -  person hippietrail    schedule 12.12.2020
comment
Хм. Интересный материал. Я добавил эту ветку в закладки. Продолжать копать. Удачи. !   -  person Ajay Kumar    schedule 12.12.2020
comment
Обычно API отсутствует, кроме системных вызовов, прерываний, обмена сообщениями и прочего, связанного с использованием C. Вы можете программно искать устройства с помощью системных вызовов. system_profiler звучит как программа, а не как системный интерфейс.   -  person Rob    schedule 15.12.2020
comment
Системный профайлер - это программа, которая каким-то образом получает эту информацию, показывая, что ее можно получить из системы. Итак, я искал этот метод или любой другой, который работает.   -  person hippietrail    schedule 15.12.2020


Ответы (2)


Вы можете получить съемную / извлекаемую информацию прямо из 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)
}
person vadian    schedule 15.12.2020
comment
Отлично! Есть ли простой способ распечатать все пары ключ / значение? Я хотел бы найти критерии, по которым можно отфильтровать дом и сеть, которые на самом деле не являются драйверами. Я слишком новичок, чтобы понять, как, просматривая документы и гуглия ... - person hippietrail; 15.12.2020
comment
См. Изменение, хорошие тома - это начальный том (/) и все тома в /Volumes - person vadian; 15.12.2020
comment
Оказывается, простая проверка того, начинается ли путь с /Volumes, ненадежна: apple.stackexchange.com/questions/409482/ < / а> - person hippietrail; 22.12.2020
comment
Конечно, в принципе возможно монтировать диски где-то еще, но это очень маловероятно, и я не знаю ни одного случая. Ваш принятый ответ на Stackexchange относится к общим томам, но этот вопрос явно касается локальных жестких дисков, подключенных по USB. - person vadian; 22.12.2020

Я никогда раньше не писал код для 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")
        }
    }
}
person hippietrail    schedule 14.12.2020
comment
Как мы можем получить URL-адреса всех томов, например, смонтированныеVolumeURL в C ++. - person Ahad Khan; 03.05.2021
comment
@AhadKhan: Не знаю. Я бы предпочел кодировать на C / C ++, но это такая битва, выясняя, как что-либо делать в macOS. Я перешел к другим вещам и сейчас забыл об этом. Удачи! - person hippietrail; 03.05.2021