也许“缩短”这个词并不恰当;我会尽力解释。
我想向用户显示文件的路径,但我希望将主路径缩短为 ~,将根路径缩短为/。
例如,给定用户主目录中的文件 MyImage.png 的路径类似于:
/Volumes/SSD/Users/zach/Pictures/MyImage.png
但我想要的是:
~/Pictures/MyImage.png
同样,相对于根目录的文件,如下所示:
/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 )。
最佳答案
为了显示文件名,建议使用特殊的 NSFileManager
方法,而不是对路径字符串进行操作。本地化和其他东西。
即 displayNameAtPath:
和 componentsToDisplayForPath:
。
后者会自动删除“Volumes”字符串。至于删除根卷名称,请考虑比较卷 ID。例如:
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
}
关于objective-c - 获取 "shortened"版本的文件路径的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22828432/