使用boost :: filesystem :: path获取绝对路径

时间:2012-09-28 16:28:14

标签: c++ boost path filesystems

我当前的工作目录位于/home/myuser/program,我创建了一个指向它的boost::filesystem::path对象。我添加了/../somedir,因此它变为/home/myuser/program/../somedir。但我需要得到其解析的绝对路径,即/home/myuser/somedir

我已经尝试了很长时间,我在their reference中找不到任何方法来执行此操作。有一个名为make_absolute的方法,似乎应该按照我的预期行事,但我必须给它一个“根”路径参数。应该是哪个?我真的需要这样做才能获得真正的绝对路径吗?还有其他办法吗?

4 个答案:

答案 0 :(得分:23)

你说你想要一个绝对路径,但是你的例子表明你已经有了绝对路径。删除路径的..组件的过程称为规范化。为此,您应该致电canonical。它恰好也执行absolute的任务,因此您无需先拨打absolutemake_absolutemake_absolute函数需要基本路径;如果你没有更好的东西,你可以通过它current_path()

答案 1 :(得分:11)

更新,因为这仍然是Google在绝对路径方面的最大打击:

自Boost 1.57起,之前建议的一些功能已被删除。

对我有用的解决方案是

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo);

(使用boost / filesystem / operations.hpp中定义的独立方法canonical(),它通过boost / filesystem.hpp自动包含)

重要提示:在不存在的路径上调用规范(例如,您要创建文件)将引发异常。在这种情况下,你的下一个最好的选择可能是boost :: filesystem :: absolute()。它也适用于不存在的 路径,但不会摆脱路径中间的点(如在/ b / c /../../ d.txt中)。 注意:确保relativeTo引用一个目录,在引用文件的路径上调用parent_path()(例如,包含相对于自身的目录或文件路径的打开文件)。

答案 2 :(得分:1)

make_absolute path absolute(const path& p, const path& base=current_path());有一个默认为当前路径的可选第二个参数的documentation shows

{{1}}

在没有第二个参数的情况下尝试它,看看它是否返回您正在寻找的结果。

答案 3 :(得分:0)

  

我必须给它一个“根”路径参数。

Check the docs: 没有给它任何东西;它有一个默认的第二个参数。即,当前目录。

相对路径是相对于某个目录的。因此,在使路径绝对时,您需要知道相对于它应该是绝对的。这就是“根路径”:它相对于的目录。