0

次のコードで 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 で使用するため)

誰にもアイデアがありますか?ありがとう。

4

2 に答える 2

7

DADiskCreateFromVolumePathの代わりに使用DADiskCreateFromBSDName:

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

スウィフトコード:

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)
        }
    }
}
于 2013-06-11T09:25:19.637 に答える