在Cocoa中获取相对路径

时间:2011-07-18 13:44:30

标签: cocoa relative-path

我想在cocoa app中获得相对路径。

离。

  • 输入:/Users/foo/bar/sample.txt
  • 基本路径:/ Users / foo
  • 预期输出:bar / sample.txt

我怎么能得到这个?

3 个答案:

答案 0 :(得分:1)

查看GitHub上的开源KSFileUtilities类。

我知道它们可以使用URL,但大多数API建议现在使用基于NSURL的文件路径。

即便如此,也有一些获取相对路径的方法。

答案 1 :(得分:1)

如果您正在讨论基本路径的相对路径,则可以尝试NSString类中的componentsSeparatedByString方法。它返回一个数组。

例如,如果你有/User/boo/bar/sample.txt的NSString *输入,你通过以下方式调用方法: [input componentsSeparatedByString:@"/"],你将得到一个4的数组。元素0 =用户,元素1 = boo,元素2 = bar,元素3 = sample.txt。

从那里你可以与你的基本路径进行比较,只使用剩下的并使用NSString类中的stringByAppendingPathComponent方法将它们追加回来。

答案 2 :(得分: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
}