(macruby语法中的代码示例)
如果我创建了一个网址:
u1 = NSURL.fileURLWithPath('/tmp')
然后尝试创建一个解析了符号链接的网址:
u2=u1.URLByResolvingSymlinksInPath
我回来了/ tmp:
irb(main):010:0> u2.pathComponents
=> ["/", "tmp"]
这是一个问题,因为如果我使用此NSURL(或/ var或/ etc)创建NSDirectoryEnumerator,并预取NSURLParentDirectoryURLKey,则返回的NSURL将具有path / private / tmp /...
我需要获取相对于NSDirectoryEnumerator根目录的目录路径的组件。有没有一种强大的方法来做到这一点,除了硬编码检测我所知道的特殊情况(到目前为止是/ tmp,/ var和/ etc)?
是否有人知道URLByResolvingSymlinksInPath不起作用的其他“特殊”目录?
答案 0 :(得分:3)
我从未能找到完整的答案。对于我的情况,我向NSURL添加了一个方法来处理/ tmp,/ var& /等等:
class NSURL
def URLByResolvingSymlinksInPathIncludingPrivate
url = self.URLByResolvingSymlinksInPath
parts = url.pathComponents
if (parts.first == '/') && ['tmp', 'var', 'etc'].include?(parts[1])
url = NSURL.fileURLWithPathComponents(['/', 'private'] + parts[1..-1])
end
url
end
end
我决定最好添加一个显式方法而不是monkeypatch URLByResolvingSymlinksInPath。
答案 1 :(得分:0)
Matt Gallagher - Resolving a path containing a mixture of aliases and symlinks
StackOverflow - Resolving Finder alias files
我自己的解决方案只解析符号链接,但不解析别名文件。
extension URL {
func resolveSymlinks() -> URL? {
let fm = FileManager.default
var url = self.resolvingSymlinksInPath()
for _ in 0..<100 { // prevent infinite loop
guard let target: String = try? fm.destinationOfSymbolicLink(atPath: url.path) else {
return url
}
if target.hasPrefix("/") {
url = URL(fileURLWithPath: target)
continue
}
url = url.deletingLastPathComponent().appendingPathComponent(target)
}
return nil
}
}
// URL(fileURLWithPath: "/tmp").resolveSymlinks()
// file:///private/tmp/