我当前的工作目录位于/home/myuser/program
,我创建了一个指向它的boost::filesystem::path
对象。我添加了/../somedir
,因此它变为/home/myuser/program/../somedir
。但我需要得到其解析的绝对路径,即/home/myuser/somedir
。
我已经尝试了很长时间,我在their reference中找不到任何方法来执行此操作。有一个名为make_absolute
的方法,似乎应该按照我的预期行事,但我必须给它一个“根”路径参数。应该是哪个?我真的需要这样做才能获得真正的绝对路径吗?还有其他办法吗?
答案 0 :(得分:23)
你说你想要一个绝对路径,但是你的例子表明你已经有了绝对路径。删除路径的..
组件的过程称为规范化。为此,您应该致电canonical
。它恰好也执行absolute
的任务,因此您无需先拨打absolute
或make_absolute
。 make_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:你 没有给它任何东西;它有一个默认的第二个参数。即,当前目录。
相对路径是相对于某个目录的。因此,在使路径绝对时,您需要知道相对于它应该是绝对的。这就是“根路径”:它相对于的目录。