NSURL.URLByResolvingSymlinksInPath не работает для / tmp, / var. Есть ли обходной путь? - PullRequest
2 голосов
/ 30 июля 2011

(примеры кода в синтаксисе макруби)

Если я создаю URL с:

u1 = NSURL.fileURLWithPath('/tmp')

и затем попытайтесь создать URL с разрешенными символическими ссылками:

u2=u1.URLByResolvingSymlinksInPath

Возвращаюсь / tmp:

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

Это проблема, потому что, если я создаю NSDirectoryEnumerator с этим NSURL (или / var или / etc), и предварительно выбираю NSURLParentDirectoryURLKey, возвращаемые NSURL будут иметь путь /private/tmp/...

Мне нужно получить компоненты каталогов, относящиеся к корню NSDirectoryEnumerator. Есть ли надежный способ сделать это, кроме жестко заданного обнаружения особых случаев, о которых я знаю (которые до сих пор называются / tmp, / var и / etc)?

Кто-нибудь знает о других «специальных» каталогах, в которых URLByResolvingSymlinksInPath не работает?

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Мне так и не удалось найти полный ответ на этот вопрос.Для моего случая я добавил в 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.

0 голосов
/ 12 января 2017

Мэтт Галлахер - Разрешение пути, содержащего смесь псевдонимов и символических ссылок

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/
...