2011-07-18 11 views
1

私はココアアプリで相対パスを取得したいと思います。ココアで相対パスを取得

ex。

  • 入力:/Users/foo/bar/sample.txt
  • ベースのパス:/ユーザー/ fooの
  • 予想される出力:バー/ sample.txtの

私はこれを取得できますか?

+0

何と関連していますか?ユーザーが入力したベースパス、ホームフォルダなどですか? –

答えて

1

GitHubのオープンソースKSFileUtilitiesクラスをご覧ください。

URLで動作することはわかっていますが、ほとんどのAPIではNSURLベースのファイルパスを使用することをおすすめします。

でも、相対パスを取得する方法はいくつかあります。

+0

返信いただきありがとうございますが、OSXにはデフォルトで組み込まれているAPIはありませんか? –

1

基本パスの相対パスについては、NSStringクラスのcomponentsSeparatedByStringメソッドを試してみてください。配列を返します。

たとえば、NSString *入力が/User/boo/bar/sample.txtで、メソッドを [input componentsSeparatedByString:@"/"]で呼び出すと、4の配列が得られます。要素0 =ユーザー、要素1 = boo、要素2 =棒、要素3 = sample.txt。

そこから、ベースパスとの比較を行い、残りの部分だけを取り、NSStringクラスのstringByAppendingPathComponentメソッドを使用してそれらを追加します。

+3

これを行わないでください。代わりに ' - [NSString pathComponents]'を使用してください。 '/'がパスコンポーネントのセパレータであるという保証はありません。 – lemnar

+0

@lemnarこれはOS Xで保証されていますが、多くの人がObjective-Cで他のプラットフォーム用に何かを書いているわけではありません。実際の理由は、ファイル/フォルダ名に '/'を付けることができるからです。 – tbodt

0

これを行う方法はありません。いくつかの人々にとって便利なSwiftの簡単な例が以下にありますが、ルールには多くの例外があることを覚えておいてください。そうすれば、KSFileUtilitiesの方がうまくいくでしょう。

func relativePath(absolutePath : String, basePath : String) -> String { 
    var absolutePathComponents = absolutePath.pathComponents 
    var basePathComponents = basePath.pathComponents 

    if absolutePathComponents.count < basePathComponents.count { 
     return absolutePath 
    } 

    var levelIndex = 0 //number of basePath components in absolute path 

    for (index, baseComponent) in enumerate(basePathComponents) { 

     if (baseComponent != absolutePathComponents[index]) { 
      break 
     } 
     levelIndex++ 
    } 

    if levelIndex == 0 { 
     return absolutePath 
    } 

    var relativePath : String = "" 


    if levelIndex < basePathComponents.count { 
     //outside of base path 
     for (var index = levelIndex; index < basePathComponents.count; index++) { 
      relativePath = relativePath.stringByAppendingPathComponent("../") 
     } 
    } 


    for(var index = levelIndex; index < absolutePathComponents.count; index++) { 
     relativePath = relativePath.stringByAppendingPathComponent(absolutePathComponents[index]) 
    } 

    return relativePath 
}