【问题标题】:Get block device from NSURL从 NSURL 获取块设备
【发布时间】:2013-04-26 12:38:35
【问题描述】:

问题说明了一切。如何从代表例如可移动媒体的 NSURL 获取块设备?我想从/Volumes/MyDevice 得到类似/dev/disk2 的东西。我想知道如果不使用 IOKit 框架是否可以做到这一点!任何帮助表示赞赏。

【问题讨论】:

    标签: cocoa block device nsurl block-device


    【解决方案1】:

    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
    • 啊,没错。我在我的一些代码中硬编码了 /dev 前缀——考虑到它一直存在(而且 DiskManagement.framework 似乎也是如此),我认为它足够安全。我同意 f_mntfromname 的记录令人困惑。
    • DiskArb 是在 IIRC 10.3 中作为私有框架引入的;根据文档,它在 10.4 中公开。
    • 非常感谢您详尽的回答。我决定使用statfs 来获取块设备,因为 DA 框架只返回类似于disks1 的东西给我。相反,我必须使用DADiskUnmount,因为unmount(s.f_mntfromname,MNT_FORCE) 似乎总是失败。
    • @Nickkk:umount(只有一个n)采用指向挂载点的路径,而不是指向设备的路径。
    猜你喜欢
    • 2015-04-06
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2012-04-08
    相关资源
    最近更新 更多