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

32

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

我已经尝试了很长时间,但在参考文档中没有找到任何能够实现此功能的方法。有一个名为make_absolute的方法,似乎可以完成我期望的任务,但我必须给它一个“根”路径参数。应该是什么?我真的需要这样做才能获得真正的绝对路径吗?还有其他方法吗?

5个回答

25
您说您需要一个绝对路径,但是您的示例已经显示出您已经有了一个绝对路径。去除路径中 .. 组件的过程称为 规范化。为此,您应该调用 canonical。它也执行 absolute 的任务,因此您不需要先调用 absolutemake_absolutemake_absolute 函数需要一个基本路径; 如果没有更好的选择,可以将其传递给 current_path()

没错。我不想使用“规范”的词,因为我不确定它是否也意味着已解析的符号链接等。例如,我尝试了你的建议,它立即起作用了。谢谢。 - user1598585
6
请注意,如果文件不存在,规范化操作会抛出异常。因此,您只能构造已存在的路径。 - Yuriy Petrovskiy

14

更新,由于这仍然是Google关于绝对路径的热门搜索结果:

自Boost 1.57版本以来,一些先前建议使用的函数已被删除。

对我有用的解决方案是

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

使用自由方式的方法 canonical(),在boost/filesystem/operations.hpp中定义,并通过boost/filesystem.hpp自动包含。

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


“previousPath”和“relativeTo”的示例路径字符串是什么?我无法确定输入需要的路径样式。 - Elan Hickler
之前的路径可能是类似于path("../../readme.txt"),而相对路径为path("c:/example/test/blah"),这样就可以解析为"c:/example/readme.txt"。如果之前的路径已经是绝对路径,则不确定relativeTo的作用(或者是否需要一个合理的输入)。 - Daniel

1

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

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

尝试不带第二个参数运行它,看看是否返回你想要的结果。


这是文档中让我有点不太舒服的矛盾之一。有一个名为 make_absolute 的方法,它只有一个参数,但是当我跟着链接时,它将我引导到一个接受两个参数的 absolute() 函数的文档页面。尽管如此,像 absolute(pathObject).string() 这样做会返回相同的未解析路径。这就是你建议的,对吗? - user1598585

0
// 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();
}

1
你能多解释一点吗? - Paul Floyd

0

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

查看文档:你不需要给它任何东西;它有一个默认的第二个参数。也就是说,当前目录。

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


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