【问题标题】:Volume UUID using IOKit framework from OS X使用 OS X 的 IOKit 框架的卷 UUID
【发布时间】:2015-09-29 18:16:59
【问题描述】:

我想获取/枚举安装在我的 OS X 系统上的卷的 UUID。 我知道我可以使用 diskutil 命令来获取它,如下所示。

$ diskutil info / |grep "Volume UUID"
   Volume UUID:              039B9653-52AA-34F3-AF4A-854FA47C811A

但是,我想使用 IOKit 框架以可编程的方式(也许)实现它。 如果有人能告诉我该怎么做,那将非常有帮助。

非常感谢您提前提供的帮助!

【问题讨论】:

    标签: macos uuid volume iokit


    【解决方案1】:

    感谢@pmdj 的回答,我可以使用以下代码sn-p 解决我的问题。

    void printUUID()
    {
        DADiskRef disk;
        CFDictionaryRef descDict;
    
        DASessionRef session = DASessionCreate(NULL);
    
        std::string mountPoint = "/";
        CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8 *) mountPoint.c_str(), mountPoint.length(), TRUE);
        disk = DADiskCreateFromVolumePath(NULL, session, url);
        if (disk) {
            descDict = DADiskCopyDescription(disk);
            if (descDict) {
                CFTypeRef value = (CFTypeRef)CFDictionaryGetValue(descDict,
                                                                  CFSTR("DAVolumeUUID"));
                CFStringRef strValue = CFStringCreateWithFormat(NULL, NULL,
                                                                CFSTR("%@"), value);
                printf("%s\n" ,CFStringGetCStringPtr(strValue, kCFStringEncodingMacRoman));
                CFRelease(strValue);
                CFRelease(descDict);
            }
            CFRelease(disk);
        }
    
        CFRelease(url);
        CFRelease(session);
    }
    

    【讨论】:

    • 很高兴你能成功!不要忘记CFRelease(session);(我意识到您可能已经在您的真实代码中这样做了,只是没有在此处复制粘贴的代码中。)
    • @pmdj 我修改了 sn-p,因为你再次推荐了很多帮助!
    【解决方案2】:

    您查看过Disk Arbitration framework 吗?这更适合于卷枚举、挂载操作等,并允许您在其他属性中查询 UUID。如果需要,您也可以检索底层 IOKit 对象的 IOService 句柄。

    请注意,HFS+ 文件系统和它所在的 GPT 分区都将具有 UUID,并且它们不会匹配。 diskutil 通常谈论 HFS+ UUID。

    【讨论】:

    • 哦。我不知道。我会看一看。非常感谢!
    【解决方案3】:

    有一种更简单的方法可以从不必使用磁盘仲裁框架的路径中获取 UUID。下面的代码使用 NSURL 的 getResourceValue 和 NSURLVolumeUUIDStringKey 返回输入完整项目路径的卷 UUID:

        NSURL* pathUrl = [NSURL fileURLWithPath:path];
        NSString* volumeUUID = nil;
        NSError* error = nil;
        BOOL success = [pathUrl getResourceValue:&volumeUUID forKey:NSURLVolumeUUIDStringKey error:&error];
    

    请注意,它不会枚举已挂载卷的 UUID,只是为您提供输入路径的卷 UUID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2010-11-20
      • 2011-12-03
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多