【问题标题】:how can I know the relationship between usb device node and volume on macmac上怎么知道usb设备节点和音量的关系
【发布时间】:2012-10-08 17:06:12
【问题描述】:

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

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

现在在代码中,我们可以通过调用 [[NSWorkspace sharedWorkspace] mountedRemovableMedia][[NSFileManager defaultFileManager] mountedVolumeURLsInclud.....] 来了解已安装的卷

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

连kIOMediaClassName加上这两个函数我们就知道卷媒体了,

我们可以通过路径确定每个卷媒体属于哪个 USB 设备。

但我不知道卷媒体的挂载点。

其他有用的东西。

对不起,我的泳池英语。

【问题讨论】:

  • 使用函数 getmntinfo() 我们将获得诸如执行命令 'mount' 元素 f_mntonname 和 statfs 中的 f_mntfromname 的信息 f_mntfromname 将是 /dev/bsdname 我们可以通过检查“BSD Name”属性获得 bsdname我们通过使用 kIOMediaClassName 获得的对象,所以我归档了我的目标,尽管它可能有些复杂。

标签: macos usb media volume mount


【解决方案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];

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多