0

我的代码有时会获取指向卷组的辅助卷的路径。

例如,在 Catalina 或 Big Sur 启动卷上,其中有一个 System 和一个 Data 角色成员,我可能有如下路径:

/System/Volumes/Data/usr/local/bin

常规(“规范化”)路径将是:

/usr/local/bin

如何使用可用的 macOS 框架函数(Obj-C 或 Swift)将第一条路径转换为第二条路径?

请注意,我不想简单地为此硬编码字符串替换,因为至少在 Big Sur 上,组中的其他已安装卷也会发生同样的情况。例如,我可能有另一个 10.15 的可引导系统,其卷名为“Catalina”,然后这两个卷将显示为:

系统:/Volumes/Catalina 数据:/Volumes/Catalina - 数据

现在,如果我得到类似 的路径/Volumes/Catalina - Data/Users/Shared,我想将其规范化为/Volumes/Catalina/Users/Shared.

4

2 回答 2

1

NSStringsresolvingsymlinksinpath方法应该可以解决问题!

给定let path:String = "/System/Volumes/Data/Users/"

(lldb) po path
"/System/Volumes/Data/Users/"

(lldb) po (path as NSString).resolvingSymlinksInPath
"/Users"
于 2020-11-06T19:31:03.240 回答
1

除了帕特里克的回答之外,这里还有一些应该也可以使用的替代方案:

// macOS 10.12 and later:
NSString *normalizedPath;
[url getResourceValue:&normalizedPath forKey:NSURLCanonicalPathKey error:nil];

// pre-10.12:
NSURL *normalizedURL = url.fileReferenceURL.filePathURL;

此外,该fcntl电话F_GETPATH_NOFIRMLINK应该适用于此。

但是,不起作用的是[NSURL URLByStandardizingPath]

请注意,固定链接卷的根,例如/System/Volumes/Data,不会/像人们希望的那样导致。这个路径需要特殊处理,即需要检测它是一个卷 ( NSURLIsVolumeKey),如果是,则确定它的“主”成员。有关完成该部分的方法,请参阅https://stackoverflow.com/a/63886185/43615

要确定 shell(终端)中的规范化路径,请参阅https://superuser.com/a/1490999/41872

于 2020-11-06T19:50:33.343 回答