2011-07-30 9 views
2

(MacRubyの構文のコード例)/tmp、/ varに対してNSURL.URLByResolvingSymlinksInPathが機能しません。回避策はありますか?

私はURLを作成する場合:

u1 = NSURL.fileURLWithPath('/tmp') 

、その後解決シンボリックリンクでURLを作成しよう:

u2=u1.URLByResolvingSymlinksInPath 

私は/バックTMPを取得:

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

この問題は、NSDirectoryEnumeraこのNSURL(または/ varまたは/ etc)を持っていて、NSURLParentDirectoryURLKeyをプリフェッチすると返されるNSURLはパス/ private/tmp /を持ちます...

私は相対的なディレクトリパスのコンポーネントを取得する必要がありますNSDirectoryEnumeratorのルート。私が知っている特殊なケース(これは/ tmp、/ var、/ etcなど)のハードコードされた検出以外に、これを行う堅牢な方法はありますか?

は、他の「特別な」ディレクトリを認識して、誰がどのURLByResolvingSymlinksInPathは動作しませんか?

答えて

2

私は決して完全な答えを見つけることができませんでした。

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 

私はそれが明示的なメソッドを追加し、URLByResolvingSymlinksInPathをモンキーパッチではないことが最善と判断しました:私の場合のために、私はハンドルNSURLの方法を/ tmp、/ VAR &の/ etcを追加しました。

+1

これを見つけるのはあなただけではありません。 :-) - "[NSURL(symlinkAdditions)URLByReallyResolvingSymlinksInPath]" のFinal Cut Pro Xでは、アップル自身が呼ばれる回避策メソッドを持っています –

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/ 
関連する問題