2

例如,我有一个闪存盘(KingStone Mass Storage),并且只有一个分区,所以当我将它插入 mac 时。我会看到一个 Volume(它可能是 /Volumes/KingStone)被自动挂载了。我们可以看到卷(/Volumes/Kingstone)属于金士顿磁盘。

但现在我插入了另一个磁盘,例如 AData 磁盘。并安装了另一个卷。我怎么知道哪个卷属于金石磁盘。(我们可以通过 VenderID 知道哪个磁盘是 kongston)。

现在在代码中,我们可以通过调用[[NSWorkspace sharedWorkspace] mountedRemovableMedia][[NSFileManager defaultFileManager] mountedVolumeURLsInclud.....]

我们还可以通过将 kIOUSBDeviceClassName 与 IOServiceMatching 和 IOServicesGetMatchingServices 一起使用来了解所有 USB 设备

甚至 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 回答