如何规范化指向 APFS 卷组成员的路径
How to normalize paths pointing to members of an APFS Volume Group
我的代码有时会获取指向卷组辅助卷的路径。
例如,在 Catalina 或 Big Sur 启动卷上,有一个系统和一个数据角色成员,我可能有如下路径:
/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
。
NSString
s resolvingsymlinksinpath
方法应该可以解决问题![=14=]
给定 let path:String = "/System/Volumes/Data/Users/"
:
(lldb) po path
"/System/Volumes/Data/Users/"
(lldb) po (path as NSString).resolvingSymlinksInPath
"/Users"
除了 Patrick 的回答之外,这里还有一些应该也有效的替代方法:
// 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]
请注意,firmlinked 卷的根目录,例如/System/Volumes/Data
,不会像人们希望的那样导致 /
。这条路径需要特殊处理,即需要检测它是一个卷 (NSURLIsVolumeKey
),如果是,则确定其“主”成员。请参阅 了解完成该部分的方法。
要确定 shell(终端)中的规范化路径,请参阅 https://superuser.com/a/1490999/41872
我的代码有时会获取指向卷组辅助卷的路径。
例如,在 Catalina 或 Big Sur 启动卷上,有一个系统和一个数据角色成员,我可能有如下路径:
/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
。
NSString
s resolvingsymlinksinpath
方法应该可以解决问题![=14=]
给定 let path:String = "/System/Volumes/Data/Users/"
:
(lldb) po path
"/System/Volumes/Data/Users/"
(lldb) po (path as NSString).resolvingSymlinksInPath
"/Users"
除了 Patrick 的回答之外,这里还有一些应该也有效的替代方法:
// 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]
请注意,firmlinked 卷的根目录,例如/System/Volumes/Data
,不会像人们希望的那样导致 /
。这条路径需要特殊处理,即需要检测它是一个卷 (NSURLIsVolumeKey
),如果是,则确定其“主”成员。请参阅 了解完成该部分的方法。
要确定 shell(终端)中的规范化路径,请参阅 https://superuser.com/a/1490999/41872