使用OS X中的IOKit框架获取卷UUID

3

我希望获取/枚举挂载在我的OS X系统上的卷UUID。我知道可以使用以下命令diskutil获取。

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

然而,我希望以可编程的方式(也许)利用IOKit框架来实现它。如果有人能告诉我如何做到这一点,那将非常有帮助。

提前感谢您的帮助!

3个回答

3

感谢@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);
}

1
很高兴你已经让它工作了!不要忘记 CFRelease(session); (我意识到你在真正的代码中可能已经这样做了,只是在这里复制粘贴时没有)。 - pmdj
@pmdj,我按照你的建议修改了代码片段,非常感谢你的帮助! - kjee

1

你有没有了解过磁盘自动挂载框架?它非常适合用于卷枚举、挂载操作等,并可允许你查询UUID和其他属性。同时,如果需要,你还可以检索底层IOKit对象的IOService句柄。

请注意,HFS+文件系统和其所在的GPT分区都会有一个UUID,而它们不匹配。diskutil通常会提到HFS+ UUID。


哦,我不知道那个。我会去看一下。非常感谢! - kjee

1

有一种更简单的方法可以从没有使用磁盘仲裁框架的路径获取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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接