簡體   English   中英

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

[英]Volume UUID using IOKit framework from OS X

我想得到/枚舉我的OS X系統上安裝的卷的UUID。 我知道我可以使用diskutil命令來獲取它,如下所示。

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

但是,我希望使用IOKit框架以可編程方式(可能)實現它。 如果有人能告訴我該怎么做,那將非常有幫助。

非常感謝您的幫助!

感謝@ 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。如果需要,您也可以檢索基礎IOKit對象的IOService句柄。

請注意,HFS +文件系統和它所駐留的GPT分區都將具有UUID,並且它們將不匹配。 diskutil通常會討論HFS + UUID。

有一種更簡單的方法可以從不必使用磁盤仲裁框架的路徑獲取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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM