【问题标题】:Get a list of unmountable drives using Cocoa使用 Cocoa 获取可卸载驱动器的列表
【发布时间】:2012-07-22 22:07:55
【问题描述】:

我想获取在 OS X 下使用 Cocoa/Objective-C 可卸载/可弹出的驱动器列表。

我希望 NSWorkspace getFileSystemInfoForPath::::: 能帮助我:

NSArray* listOfMedia = [[NSWorkspace sharedWorkspace] mountedLocalVolumePaths];
NSLog(@"%@", listOfMedia);

for (NSString* volumePath in listOfMedia)
{
    BOOL isRemovable = NO;
    BOOL isWritable  = NO;
    BOOL isUnmountable = NO;
    NSString* description = [NSString string];
    NSString* type = [NSString string];

    BOOL result = [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath:volumePath 
                                                             isRemovable:&isRemovable 
                                                              isWritable:&isWritable 
                                                              isUnmountable:&isUnmountable 
                                                                description:&description
                                                                       type:&type];
    NSLog(@"Result:%i Volume: %@, Removable:%i, W:%i, Unmountable:%i, Desc:%@, type:%@", result, volumePath, isRemovable, isWritable, isUnmountable, description, type);
}

输出:

...
Result:1 Volume: /Volumes/LR Photos, Removable:0, W:1, Unmountable:0, Desc:hfs, type:hfs
...

“LR Photos”是一个外部驱动器(通过 Thunderbolt 连接),应该是可移动和/或不可安装的(或者,至少我认为应该是)。 :)

我应该以不同的方式解决这个问题吗?

提前致谢!

【问题讨论】:

  • 磁盘工具对卷有什么看法?如果您尝试在 Finder 中弹出它会怎样?
  • “LR Photos”驱动器是如何格式化的?
  • 感谢您的好评。我真正想做的就是建立一个列表,列出所有连接到机器的驱动器,如果我想这样做,可以被弹出/卸载。现在我通过 Finder 来做,但我想从一个地方做(一个额外的菜单栏等)。我知道 Mac App Store 中有应用程序可以执行此操作,但我想自己编写。 :) 再次感谢!

标签: objective-c macos cocoa osx-lion


【解决方案1】:

您可以使用diskArbitration framework

#import <DiskArbitration/DiskArbitration.h>
   +(NSMutableArray *)getListOfEjectableMedia
{
    NSArray *mountedRemovableMedia = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:nil options:NSVolumeEnumerationSkipHiddenVolumes];
    NSMutableArray *result = [NSMutableArray array];
    for(NSURL *volURL in mountedRemovableMedia)
    {
        int                 err = 0;
        DADiskRef           disk;
        DASessionRef        session;
        CFDictionaryRef     descDict;
        session = DASessionCreate(NULL);
        if (session == NULL) {
            err = EINVAL;
        }
        if (err == 0) {
            disk = DADiskCreateFromVolumePath(NULL,session,(CFURLRef)volURL);
            if (session == NULL) {
                err = EINVAL;
            }
        }
        if (err == 0) {
            descDict = DADiskCopyDescription(disk);
            if (descDict == NULL) {
                err = EINVAL;
            }
        }
        if (err == 0) {
            CFTypeRef mediaEjectableKey = CFDictionaryGetValue(descDict,kDADiskDescriptionMediaEjectableKey);
            CFTypeRef deviceProtocolName = CFDictionaryGetValue(descDict,kDADiskDescriptionDeviceProtocolKey);
            if (mediaEjectableKey != NULL)
            {
                BOOL op = CFEqual(mediaEjectableKey, CFSTR("0")) || CFEqual(deviceProtocolName, CFSTR("USB"));
                if (op) {
                    [result addObject:volURL];
                }
            }
        }
        if (descDict != NULL) {
            CFRelease(descDict);
        }
        if (disk != NULL) {
            CFRelease(disk);
        }
        if (session != NULL) {
            CFRelease(session);
        }
    }
    return result;
}

【讨论】:

    【解决方案2】:

    您可以使用命令行版本的磁盘工具应用程序“diskutil”,使用参数“list”和管道输出运行它,然后在程序中获取它(不需要使用可可)。

    【讨论】:

      【解决方案3】:

      不幸的是,getFileSystemInfoForPath: 并不是这样做的正确方法。可移动意味着该卷位于 CD 或 DVD 等可移动媒体上。在实践中,unmountable 似乎给出了与可移除相同的结果。例如,参见results using getFileSystemInfoForPath 上的这篇文章。因此,除非您只想知道某个卷是否位于可移动媒体上,否则您需要使用另一种技术。

      您真正要检查的是卷的连接总线类型。 Firewire、USB、Thunderbolt 等在您的意思上是不可安装的。如果您选择卷并按下“连接总线”下的“信息”按钮,您可以在“磁盘工具”中看到此信息。以编程方式获取这些信息要困难得多,据我所知,只有使用 IOKit 才有可能。详细信息在 Apple 的 Accessing Hardware from Applications 文档中。

      【讨论】:

      • 非常感谢您的解释。您对检查连接总线的建议足以满足我的要求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      相关资源
      最近更新 更多