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

Mar*_*rio 32 c++ filesystems boost path

我当前的工作目录位于/home/myuser/program,我创建了一个boost::filesystem::path指向它的对象.我附上/../somedir所以它变成了/home/myuser/program/../somedir.但是我需要得到它已经解决的绝对路径/home/myuser/somedir.

我已经尝试了很长时间,我没有找到他们参考的任何方法来做到这一点.有一个叫做的方法make_absolute,似乎应该做我期望的,但我必须给它一个"根"路径参数.应该是哪个?我真的需要这样做才能获得真正的绝对路径吗?还有其他方法吗?

Rob*_*edy 24

你说你想要一个绝对路径,但你的例子表明你已经有了绝对路径.删除..路径组件的过程称为规范化.为此,你应该打电话canonical.它碰巧也执行任务absolute,所以你不需要打电话absolutemake_absolute先打电话.该make_absolute功能需要一个基本路径; current_path()如果你没有更好的东西,你可以通过它.

  • 请注意,如果文件不存在,则规范抛出异常.所以你只能构建现有的路径. (4认同)

Dan*_*iel 11

更新,因为这仍然是谷歌关于绝对路径的最大打击:

从Boost 1.57开始,之前建议的一些功能已被删除.

对我有用的解决方案是

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo);
Run Code Online (Sandbox Code Playgroud)

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

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