objective-c - 获取 "shortened"版本的文件路径的简单方法

标签 objective-c macos cocoa

也许“缩短”这个词并不恰当;我会尽力解释。

我想向用户显示文件的路径,但我希望将主路径缩短为 ~,将根路径缩短为/。

例如,给定用户主目录中的文件 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/

相关文章:

android - 在 Mac OS X 上哪里安装 Android SDK?

python - 如何使用 Python 和 Scripting Bridge 将轨道添加到 iTunes 播放列表

cocoa - 在 Aquatic Prime 中生成许可证的 PHP 脚本存在问题

ios - Alpha 混合与相同的透明图像

objective-c - 一个项目的 xcode 4.6(xcode 崩溃)后无法重构(其他项目运行良好)

css - 带有谷歌网络字体的文本在 chrome/windows 和 chrome/mac 中有不同的顶部间距

macos - 为什么我的 NSView 委托(delegate)方法没有被调用?

objective-c - 如何在 Swift 中将 Int 转换为 unsigned short

ios - 现有应用在使用 Size Classes 时需要 UIScrollView

macos - 如何显示我的应用程序不是键盘记录程序?