macOS에서 USB 하드 드라이브 및 SSD를 USB 키 / 펜 드라이브와 구별하는 방법

Dec 11 2020

코드에서 외부 USB 하드 드라이브와 솔리드 스테이트 드라이브를 다른 한편으로는 USB 스틱과 구별하는 것이 어떻게 가능합니까?

macOS API (또는 시스템 호출, 인터럽트, 메시징 및 기타 사항)에 익숙하지 않지만 I / O Kit 또는 Disk Arbitration에있을 것 같습니까?

터미널 명령 줄 system_profiler SPUSBDataType에서 "이동식 미디어"아래에 나열된이 정보를 사용 하고 볼 수 있습니다 .

답변

2 vadian Dec 15 2020 at 15:19

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)
}
1 hippietrail Dec 14 2020 at 19:19

이전에 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")
        }
    }
}