繁体   English   中英

如何在OS X中以编程方式检索根磁盘分区的UUID?

[英]How to programmatically retrieve UUID of root disk partition in OS X?

我可以通过以下代码检索OS X磁盘分区UUID:

void PrintUUID() 
{
    DADiskRef disk;
    CFDictionaryRef descDict;
    DASessionRef session = DASessionCreate(NULL);
    if (session) {
        disk = DADiskCreateFromBSDName(NULL, session, "/dev/disk0s2");
        if (disk) {
            descDict = DADiskCopyDescription(disk);
            if (descDict) {
                CFTypeRef value = (CFTypeRef)CFDictionaryGetValue(descDict,
                    CFSTR("DAVolumeUUID"));
                CFStringRef strValue = CFStringCreateWithFormat(NULL, NULL,
                    CFSTR("%@"), value);
                print(strVal); <------------- here is the output
                CFRelease(strValue);
                CFRelease(descDict);
            }
            CFRelease(disk);
        }
    }
}

上面的代码检索disk0的UUID,我想检索根磁盘的UUID(装入点= /),如果我使用“ /”而不是“ / dev / disk0s2”,则DADiskCopyDescription返回NULL。 我也知道我可以通过以下命令在终端中做到这一点:

diskutil info /

简要地说,如何检索根磁盘的BSD名称? (在DADiskCreateFromBSDName中使用它)

有人有主意吗? 谢谢。

使用DADiskCreateFromVolumePath而不是DADiskCreateFromBSDName

char *mountPoint = "/";
CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8 *)mountPoint, strlen(mountPoint), TRUE);
disk = DADiskCreateFromVolumePath(NULL, session, url);
CFRelease(url);

SWIFT代码:

let mountPoint = "/"
let url = URL(fileURLWithPath: mountPoint)
if let session = DASessionCreate(nil),
    let disk = DADiskCreateFromVolumePath(nil, session, url as CFURL),
    let desc = DADiskCopyDescription(disk) as? [String: CFTypeRef] {
    if let uuid = desc["DAVolumeUUID"], CFGetTypeID(uuid) == CFUUIDGetTypeID() {
        if let uuidString = CFUUIDCreateString(nil, (uuid as! CFUUID)) {
            print(uuidString)
        }
    }
}

DADiskCreateFromVolumePath仅包含在OS 10.7及更高版本中,因此,如果您需要支持OS 10.4及更高版本(如我!)之类的较早平台,唯一的选择是使用statfs从posix名称生成BSD名称,因此整个函数变成:

#include <sys/param.h>
#include <sys/mount.h>

void PrintUUID() 
{
    DADiskRef disk;
    CFDictionaryRef descDict;
    DASessionRef session = DASessionCreate (kCFAllocatorDefault);
    if (session) {
        struct statfs statFS;
        statfs ("/", &statFS);
        disk = DADiskCreateFromBSDName (kCFAllocatorDefault, session, statFS.f_mntfromname);
        if (disk) {
            descDict = DADiskCopyDescription (disk);
            if (descDict) {
                CFTypeRef value = (CFTypeRef) CFDictionaryGetValue (descDict, CFSTR("DAVolumeUUID"));
                CFStringRef strValue = CFStringCreateWithFormat (NULL, NULL, CFSTR("%@"), value);
                print (strValue)  <------------- here is the output
                CFRelease (strValue);
                CFRelease (descDict);
            }
            CFRelease (disk);
        }
        CFRelease (session);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM