32

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

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

4

5 回答 5

24

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

于 2012-09-28T16:49:28.850 回答
13

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

从 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()(例如,打开的文件包含相对于自身的目录或文件路径)。

于 2014-12-15T13:54:41.580 回答
1

The documentation shows that the make_absolute has an optional second parameter that defaults to your current path:

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

Try it without the second parameter and see if it returns the results you're looking for.

于 2012-09-28T16:32:06.903 回答
0

I have to give it a “root” path argument.

Check the docs: you don't have to give it anything; it has a default second parameter. Namely, the current directory.

Relative paths are relative to some directory. Thus, when making a path absolute, you need to know what it should be absolute relative to. That's the "root path": the directory it is relative to.

于 2012-09-28T16:32:24.777 回答
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();
}
于 2021-01-15T08:26:45.877 回答