2010-01-09 53 views
3

我想找到给定NSString路径的卷的挂载点。cocoa objective-c for os x:从路径获取卷装入点

虽然我是Cocoa和Objective-C的初学者,但我试图做到“优雅”,即。使用提供的类之一,而不是进行外部shell调用或列出已挂载的文件系统并查找路径属于哪一个。

我找到了NSWorkspace和getFileSystemInfoForPath,但没有提到挂载点。

任何人都可以帮忙吗?

感谢

+0

路径是什么?卷上的文件,支持卷的设备或其他内容? – 2010-01-09 13:41:48

+0

卷 – 2010-01-09 17:48:59

+1

上的文件的路径我不认为有一个Cocoa方法。为了什么目的,你需要安装点?解决方案将取决于此。例如,如果卷名从Finder更改,装入点将会更改;是否需要卷名称或设备特有的独立于用户分配给它的卷名称? – Yuji 2010-01-09 19:47:30

回答

4

这应该去的东西沿着这些线路:

+ (NSString*)volumeNameForPath:(NSString *)inPath 
{ 
    HFSUniStr255 volumeName; 
    FSRef volumeFSRef; 
    unsigned int volumeIndex = 1; 

    while (FSGetVolumeInfo(kFSInvalidVolumeRefNum, volumeIndex++, NULL, kFSVolInfoNone, NULL, &volumeName, &volumeFSRef) == noErr) { 
     NSURL *url = [(NSURL *)CFURLCreateFromFSRef(NULL, &volumeFSRef) autorelease]; 
     NSString *path = [url path]; 

     if ([inPath hasPrefix:path]) { 
      return [NSString stringWithCharacters:volumeName.unicode length:volumeName.length] 
     } 
    } 

    return nil; 
} 
+1

失败案例:存在两卷,“长名称卷”和“卷”。输入路径是“/ Volumes/Volume with long name/Some file”,并且循环首先进入“/ Volumes/Volume”。你的方法返回“/ Volumes/Volume”,这是错误的。 – 2010-01-09 13:39:07

+0

感谢您的建议。但我也发现了一个问题。 如果我使用路径 /Volumes/NO NAME/some/dir/in/bootcamp 返回的卷是os x分区的名称。 我希望有一些类/方法找到这些信息,而不是诉诸字符串操作来猜测音量。 – 2010-01-09 14:07:34

+0

这是未经测试的代码,我甚至没有尝试编译。预计错误和边缘情况。它来自我为iMedia浏览器中的Aperture解析器编写的代码。在那里我有Aperture存储的卷名,需要找到完整的路径。 我想通过确保路径字符串以/结尾可以解决失败案例。 – 2010-01-09 16:04:39

1

我这个月运行它已被要求后,但无论如何,在Python标准库中有os.path.ismount()功能,检测路径是否为安装点。从它的描述它会这样:

功能检查是否path的父,path/..,比path不同的设备上,或是否path/..path指向相同的设备在相同的i-node - 这应该检测所有Unix和POSIX变体的挂载点。