繁体   English   中英

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

[英]Get absolute path with boost::filesystem::path

我当前的工作目录位于/home/myuser/program ,我创建了一个指向它的boost::filesystem::path对象。 我附加了/../somedir所以它变成了/home/myuser/program/../somedir 但我需要获取其解析的绝对路径,即/home/myuser/somedir

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

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

更新,因为这似乎仍然是谷歌关于绝对路径的热门话题:

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

对我有用的解决方案是

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

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

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

文档显示make_absolute有一个可选的第二个参数,默认为您的当前路径:

path absolute(const path& p, const path& base=current_path());

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

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

检查文档:没有给它任何东西; 它有一个默认的第二个参数。 即当前目录。

相对路径是相对于某个目录的。 因此,在使路径成为绝对路径时,您需要知道它相对于. 那是“根路径”:它相对的目录。

// input: d:\\tmp\\\\a/../VsDebugConsole.png
// output: d:\\tmp\\VsDebugConsole.png
static std::wstring fix_path(std::wstring path)
{
    //boost::replace_all(path, L"\\\\", L"\\");
    //boost::replace_all(path, L"//", L"/");
    boost::filesystem::path bpath(path);
    bpath = boost::filesystem::system_complete(bpath);

    return bpath.wstring();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM