我想在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连接)应该是可移动和/或不可安装的(或者,至少我认为它应该是)。 :)
我应该以不同的方式解决这个问题吗?
提前致谢!
答案 0 :(得分:4)
您可以使用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;
}
答案 1 :(得分:2)
不幸的是getFileSystemInfoForPath:
并不是真正做到这一点的正确方法。可移动的意思是卷在可移动介质上,例如CD或DVD。在实践中,unmountable似乎给出了与可移动相同的结果。例如,请参阅results using getFileSystemInfoForPath上的这篇文章。因此,除非您只想知道卷是否在可移动媒体上,否则您需要使用其他技术。
您真正想要检查的是卷的连接总线类型。从某种意义上说,Firewire,USB,Thunderbolt等是无法安装的。如果选择音量并按“连接总线”下的“信息”按钮,则可以在“磁盘工具”中看到此信息。以编程方式获取此信息要困难得多,据我所知,只能使用IOKit。有关详细信息,请参阅Apple Accessing Hardware from Applications上的文档。
答案 2 :(得分:0)
您可以使用“diskutil”的“磁盘工具”应用程序的命令行版本,使用参数“list”和管道输出运行它并在程序中获取它(不需要使用cocoa)。