3

(macruby 语法中的代码示例)

如果我创建一个网址:

u1 = NSURL.fileURLWithPath('/tmp')

然后尝试创建一个已解析符号链接的 url:

u2=u1.URLByResolvingSymlinksInPath

我回来了/tmp:

irb(main):010:0> u2.pathComponents
=> ["/", "tmp"]

这是一个问题,因为如果我使用此 NSURL(或 /var 或 /etc)创建一个 NSDirectoryEnumerator,并预取 NSURLParentDirectoryURLKey,则返回的 NSURL 将具有路径 /private/tmp/...

我需要获取相对于 NSDirectoryEnumerator 的根目录路径的组件。除了硬编码检测我知道的特殊情况(到目前为止是 /tmp、/var 和 /etc)之外,是否有一种可靠的方法来做到这一点?

有谁知道 URLByResolvingSymlinksInPath 不起作用的其他“特殊”目录?

4

2 回答 2

3

我一直无法找到一个完整的答案。就我而言,我在 NSURL 中添加了一个处理 /tmp、/var 和 /etc 的方法:

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。

于 2011-08-04T21:31:56.040 回答
0

Matt Gallagher - 解析包含别名和符号链接混合的路径

StackOverflow - 解析 Finder 别名文件

我自己的解决方案只解决符号链接,而不是别名文件。

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/
于 2017-01-12T17:05:09.710 回答