简单的方法来缩短"缩短"文件路径的版本

时间:2014-04-03 05:17:35

标签: objective-c macos cocoa

也许“缩短”不是正确的用语;我会试着解释一下。

我想向用户显示文件的路径,但我希望以这样的方式将主路径缩短为〜,并将根路径缩短为/.

例如,给定用户主目录中文件MyImage.png的路径如下:

  

/Volumes/SSD/Users/zach/Pictures/MyImage.png

但我想要的是:

  

〜/图片/ MyImage.png

同样,相对于root的文件,如下所示:

  

/Volumes/SSD/Applications/MyApp.app

应该是这样的:

  

/Applications/MyApp.app

使用〜替换用户的主路径非常简单,例如:

NSString* shortPath = [fullPath stringByReplacingOccurrencesOfString:NSHomeDirectory() 
                                withString:@"~"];

但是对于根相对路径的情况,这不会解决它。

我希望答案是“把这个POSIX函数称为为你做所有魔术”,但我还是找不到那样的东西。我错过了什么吗?

更新:@ Volker下面的评论是准确的:stringByAbbreviatingWithTildeInPath确实处理了主路径案例,如果不是根相对案例的话。问题是,它基本上完成了我上面的代码所做的事情(用“〜”替换NSHomeDirectory())。这对于非沙盒应用来说很好,但在沙盒应用中,NSHomeDirectory()不会是/Users/zach,而是/Users/zach/Library/Containers/com.mycompany.myapp/Data/。因此,如果我将其传递给“/Users/zach/Pictures/MyImage.png”之类的路径,则实际上不会进行替换。

现在我只是自己做替换(如上所述,但通过获取真实的主目录路径,就像我写的here)。

1 个答案:

答案 0 :(得分:1)

为了显示文件名,建议使用特殊的NSFileManager方法,而不是对路径字符串进行操作。本地化和东西。
displayNameAtPath:componentsToDisplayForPath:

后者自动删除“Volumes”字符串。至于删除根卷名称,请考虑比较卷ID。 E.g:

    NSURL* rootURL = [NSURL fileURLWithPath:@"/"];
    NSData* rootID = nil;
    [rootURL getResourceValue:&rootID forKey:NSURLVolumeIdentifierKey error:nil];

    NSURL* fileURL = [NSURL fileURLWithPath:@"/Volumes/SSD/Applications/"];
    NSData* fileVolumeID = nil;
    [fileURL getResourceValue:&fileVolumeID forKey:NSURLVolumeIdentifierKey error:nil];

    if ([fileVolumeID isEqualToData:rootID])
    {
        // Strip "/Volumes/*/" part of path if any, then get display components
    }