2

たとえば、フラッシュディスク(KingStone Mass Storage)があり、パーティションが1つしかないので、Macに接続するとします。ボリューム(/ Volumes / KingStoneの可能性があります)が自動的にマウントされたことがわかります。volume(/ Volumes / Kingstone)がKingStonディスクに属していることがわかります。

しかし今、私はADataディスクなどの別のディスクを接続しました。そして別のボリュームがマウントされました。また、どのボリュームがキングストーンディスクに属しているかをどのように知ることができますか(VenderIDによってどのディスクがコンストンであるかを知ることができます)。

[[NSWorkspace sharedWorkspace] mountedRemovableMedia]コードでは、 ORを呼び出すことでマウントされたボリュームを知ることができます[[NSFileManager defaultFileManager] mountedVolumeURLsInclud.....]

また、IOServiceMatchingおよびIOServicesGetMatchingServicesでkIOUSBDeviceClassNameを使用することにより、すべてのUSBデバイスを知ることができます。

2つの関数を持つkIOMediaClassNameでさえ、ボリュームメディアを知っています。

パスによって、すべてのボリュームメディアがどのUSBデバイスに属しているかを判別できます。

しかし、ボリュームメディアのマウントポイントはわかりません。

他の何か役に立つもの。

私のプール英語でごめんなさい。

4

1 に答える 1

1

別の方法。

kIOMediaClass で一致する辞書を作成する

matchingDict = IOServiceMatching(kIOMediaClass);

リムーバブル ストレージ ボリュームのみを取得する場合は、kIOMediaRemovableKey と kCFBooleanTrue でディクショナリを設定します

CFDictionarySetValue(matchingDict, CFSTR(kIOMediaRemovableKey), kCFBooleanTrue);

今ならマッチングサービスも受けられるし、

IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict, &iterator);

これでデバイスを列挙できます。

while((removableMedia = IOteratorNext(iterator)))
{
    IORegistryEntryGetName(removableMedia, deviceName); 
    // and something else you can do   


    kr = IORegistryGetPath(removableMedia, kIOServicePlane, devicePath);
    // compare the path with path you get in device.
    // if one device's path is the substring of this media
    // we could simply think this media is belong to the device

    // you could get mount point by following code
    DASessionRef sessionRef = DASessionCreate(kCFAllocatorDefault);
    if (sessionRef) {
        DADiskRef diskRef - DADiskCreateFromIOMedia(kCFAllocatorDefault, sessionRef, removableMedia);
        if (diskRef) {
            CFDictionaryRef *diskProperty=DADisCopyDescription(diskRef);
            if (property) {
                NSURL *mountURL = [(NSDictionary*)property objectForKey:(NSString*)kDADiskDescriptionVolumePathKey];
                // mountURL or [mountURL path] is the mount point you want

                CFRelease(diskProperty);
            }
            CFRelease(diskRef);
        }
        CFRelease(sessionRef);
    }

    // don't forget to release
    IOObjectRelease(removableMedia);
}

そして、以下のようなオブザーバーのマウント/アンマウントイベントを実行できます

[[[NSWorkSpace sharedWorkspace] notificationCenter] addObsever:self selector:@selector(volumeMounted:) name:NSWorkspaceDidMountNotification object:nil];
[[[NSWorkSpace sharedWorkspace] notificationCenter] addObsever:self selector:@selector(volumeUnmounted:) name:NSWorkspaceDidUnmountNotification object:nil];
于 2012-11-07T08:38:09.370 に答える