也许“缩短”不是正确的用语;我会试着解释一下。
我想向用户显示文件的路径,但我希望以这样的方式将主路径缩短为〜,并将根路径缩短为/.
例如,给定用户主目录中文件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)。
答案 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
}