【发布时间】:2013-04-26 12:38:35
【问题描述】:
问题说明了一切。如何从代表例如可移动媒体的 NSURL 获取块设备?我想从/Volumes/MyDevice 得到类似/dev/disk2 的东西。我想知道如果不使用 IOKit 框架是否可以做到这一点!任何帮助表示赞赏。
【问题讨论】:
标签: cocoa block device nsurl block-device
问题说明了一切。如何从代表例如可移动媒体的 NSURL 获取块设备?我想从/Volumes/MyDevice 得到类似/dev/disk2 的东西。我想知道如果不使用 IOKit 框架是否可以做到这一点!任何帮助表示赞赏。
【问题讨论】:
标签: cocoa block device nsurl block-device
DiskArbitration.framework 会带你去那里:
NSURL *volumeURL = [NSURL fileURLWithPath:@"/Volumes/YourDisk"];
DASessionRef session = DASessionCreate(kCFAllocatorDefault);
DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault,
session,
(__bridge CFURLRef)volumeURL);
NSDictionary *desc = CFBridgingRelease(DADiskCopyDescription(disk));
/* See DADisk.h for a list of available keys */
NSLog(@"%@", desc[(NSString *)kDADiskDescriptionMediaBSDNameKey]);
CFRelease(disk);
CFRelease(session);
statfs(2) 也一样:
struct statfs s;
statfs([[volumeURL path] fileSystemRepresentation], &s);
printf("%s\n", s.f_mntfromname);
【讨论】:
f_mntfromname 的描述,这听起来不像提问者想要的,但我试过了,它确实是一个设备路径。 DiskArb 代码返回的内容略有不同:它不是完整的/dev/disk4 路径,只是名称disk4。
f_mntfromname 的记录令人困惑。
statfs 来获取块设备,因为 DA 框架只返回类似于disks1 的东西给我。相反,我必须使用DADiskUnmount,因为unmount(s.f_mntfromname,MNT_FORCE) 似乎总是失败。
umount(只有一个n)采用指向挂载点的路径,而不是指向设备的路径。