返回文件夹或卷的卷名

时间:2013-12-11 12:48:29

标签: objective-c macos cocoa url

我需要获取用户选择的任何文件夹的卷名。在参考this topic时,我创建了以下函数。

- (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;
}

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

谢谢,

更新

可能是以下情况?

- (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; 
    }
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

这就是我用的

-(NSString *)volumeNameForPath:(NSString *)path
{       
    NSArray* components = [[NSFileManager defaultManager] componentsToDisplayForPath:path];
    NSString* volumeName = components.first ?: "Unknown";       
    return volumeName;
}

答案 2 :(得分:0)

迅速:

FileManager.default.componentsToDisplay(forPath: url.path)?.first

或:

extension URL {

    func volumeName() -> String? {
        guard let resourceValues = try? resourceValues(forKeys: [.volumeNameKey]) else {
            return nil
        }

        return resourceValues.volumeName
    }

}