返回文件夹或卷的卷名

El *_*ato 2 url macos cocoa objective-c

我需要获取用户选择的任何文件夹的卷名.在参考这个主题时,我创建了以下函数.

- (NSString *)getVolumeName:(NSString *)path {
    // path is the path of a folder
    NSURL *url = [NSURL fileURLWithPath:[path stringByDeletingLastPathComponent]];
    NSError *error;
    NSString *volumeName;
    [url getResourceValue:&volumeName forKey:NSURLVolumeNameKey error:&error];
    return volumeName;
}
Run Code Online (Sandbox Code Playgroud)

它适用于大多数情况.但是,如果用户选择已安装的卷,则可能会失败.例如,我将一张SDHC卡插入iMac的卡槽中.如果我选择此卷而不是其中的文件夹,则上述函数可以返回硬盘驱动器的名称.返回文件夹或卷的卷名的绝对可靠方式是什么?也许使用AppleScript?

谢谢,

UPDATE

也许像下面这样的东西?

- (NSString *)getVolumeName:(NSString *)path {
    NSURL *url = [NSURL fileURLWithPath:[path stringByDeletingLastPathComponent]];
    if ([[url path] isEqualTo:@"/Volumes"]) {
        return [path lastPathComponent];
    } else {
        NSError *error;
        NSString *volumeName;
        [url getResourceValue:&volumeName forKey:NSURLVolumeNameKey error:&error];
        return volumeName; 
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

我目前无法对此进行测试,但我认为您应该直接在给定路径上工作,而不是删除最后一个路径组件:

- (NSString *)getVolumeName:(NSString *)path {
    // path is the path of a folder
    NSURL *url = [NSURL fileURLWithPath:path];
    NSError *error;
    NSString *volumeName;
    [url getResourceValue:&volumeName forKey:NSURLVolumeNameKey error:&error];
    return volumeName;
}
Run Code Online (Sandbox Code Playgroud)