将绝对路径和相对路径组合以获取新的绝对路径。

23

我正在编写一个程序,其中一个组件必须能够接受给定的路径(例如/help/index.html/help/)和基于该位置的相对路径(例如../otherpage/index.htmlsub/dir/of/help/help2.html),并生成由相对路径所暗示的绝对路径。请考虑下面的目录树。

/
index.html
content.txt
help/
    help1.html
    help2.html

文件index.html包含一个类似于help/help1.html的链接。程序需要接收//index.html,并将其与help/help1.html组合以获取/help/help1.html

同样,文件/help/help1.html具有链接../content.txt,程序需要返回/content.txt。是否有合理的方法来实现这一点?

谢谢。:)

编辑: 感谢Stephen Weinberg!对于未来的每个人,这是我使用的代码。

func join(source, target string) string {
    if path.IsAbs(target) {
        return target
    }
    return path.Join(path.Dir(source), target)
}
2个回答

32

使用 path.Join 结合 path.Dir 可以实现你的需求。请参考交互式示例http://golang.org/pkg/path/#example_Join

path.Join(path.Dir("/help/help1.html"), "../content.txt")

这将会返回/content.txt


谢谢!一开始它并没有完全达到我的预期,但我能够使用其他路径实用工具将其包装在一个小函数中。对于任何未来的人,这是它。func join(source, target string) string { if path.IsAbs(target) { return target } return path.Join(path.Dir(source), target) } - Alexander Bauer
我现在明白这不是你想要的。我更新了我的答案。 - Stephen Weinberg
再次感谢您;由于绝对路径被奇怪地解释,我不得不添加一个if语句。我仍然不熟悉StackOverflow特定的markdown格式,所以我只是在顶部添加了代码块。 - Alexander Bauer
@SashaCrofter,将要排版为代码的块用一对反引号(`...`)括起来。请注意,在注释中仍然无法使用多行代码块,因此您修改帖子的想法是正确的。 - kostix
这里出现了问题:例如尝试将http://example.com/a/b与/合并:它应该是http://example.com/,但实际上返回的是http://example.com/a - vad

4

Stephen的回答是正确的,但我想补充一些内容以节省未来读者的时间:

你应该注意到 path包 中的函数假定分隔符为/ 。 当使用上面的示例时,我一直得到.输出,因为我有一个使用\的Windows文件路径。

如果您不操作URL,请考虑使用filepath 包 ,该包使用操作系统的目录分隔符。

例如,在Windows上运行:

path.Dir("C:\\Users\\Darren\\Desktop\\file.txt")
filepath.Dir("C:\\Users\\Darren\\Desktop\\file.txt")

返回:

.
C:\Users\Darren\Desktop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接