![](/img/trans.png)
[英]creating a block device programmatically in mac os x using iokit framework
[英]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.