Macos 使用来自OS X的IOKit框架的卷UUID

Macos 使用来自OS X的IOKit框架的卷UUID,macos,uuid,volume,iokit,Macos,Uuid,Volume,Iokit,我想获取/枚举安装在OS X系统上的卷的UUID。 我知道我可以使用diskutil命令获得它,如下所示 $ diskutil info / |grep "Volume UUID" Volume UUID: 039B9653-52AA-34F3-AF4A-854FA47C811A 然而,我希望使用IOKit框架以可编程的方式(可能)实现它。 如果有人能告诉我怎么做,那将非常有帮助 非常感谢您的帮助 你有没有调查过这个问题?这更适合于卷枚举、装载操作等,并允许您在

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

$ diskutil info / |grep "Volume UUID"
   Volume UUID:              039B9653-52AA-34F3-AF4A-854FA47C811A
然而,我希望使用IOKit框架以可编程的方式(可能)实现它。 如果有人能告诉我怎么做,那将非常有帮助

非常感谢您的帮助

你有没有调查过这个问题?这更适合于卷枚举、装载操作等,并允许您在其他属性中查询UUID。如果需要,您还可以检索底层IOKit对象的IOService句柄


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

感谢@pmdj的回答,我可以用以下代码片段解决我的问题

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);
}

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

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

请注意,它不会枚举已装入卷的UUID,只提供输入路径的卷UUID

哦。我不知道。我去看看。谢谢!很高兴你成功了!不要忘记
CFRelease(会话)(我意识到你可能已经在真实的代码中这样做了,只是没有在这里粘贴的副本中。)@pmdj我修改了代码片段,因为你再次推荐了很多帮助!