私はココアアプリで相対パスを取得したいと思います。ココアで相対パスを取得
ex。
- 入力:/Users/foo/bar/sample.txt
- ベースのパス:/ユーザー/ fooの
- 予想される出力:バー/ sample.txtの
私はこれを取得できますか?
私はココアアプリで相対パスを取得したいと思います。ココアで相対パスを取得
ex。
私はこれを取得できますか?
GitHubのオープンソースKSFileUtilitiesクラスをご覧ください。
URLで動作することはわかっていますが、ほとんどのAPIではNSURLベースのファイルパスを使用することをおすすめします。
でも、相対パスを取得する方法はいくつかあります。
返信いただきありがとうございますが、OSXにはデフォルトで組み込まれているAPIはありませんか? –
基本パスの相対パスについては、NSStringクラスのcomponentsSeparatedByStringメソッドを試してみてください。配列を返します。
たとえば、NSString *入力が/User/boo/bar/sample.txtで、メソッドを [input componentsSeparatedByString:@"/"]
で呼び出すと、4の配列が得られます。要素0 =ユーザー、要素1 = boo、要素2 =棒、要素3 = sample.txt。
そこから、ベースパスとの比較を行い、残りの部分だけを取り、NSStringクラスのstringByAppendingPathComponentメソッドを使用してそれらを追加します。
これを行う方法はありません。いくつかの人々にとって便利な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
}
何と関連していますか?ユーザーが入力したベースパス、ホームフォルダなどですか? –