gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:52:19 25 4
gpt4 key购买 nike

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com