我想获得一个绝对规范路径,给定一个相对路径,并在 Windows 和 Linux 中使用 boost 文件系统。我希望它也适用于不存在的路径。
我正在使用weakly_canonical(pathrelativePath),自boost 1.60起可用,为了做到这一点。但它的行为并不符合预期(至少在 Windows 中)。
当传递没有父文件夹的相对路径时,即原始文件名或文件夹名称,例如“foo”,weakly_canonical返回相同的未修改路径(在本例中为“foo”),而absolute(pathrelativePath)会在当前路径前面添加到它(如我所料)(“current_dir/foo”)。
所以最后,我被迫先调用absolute,然后调用weakly_canonical以使其工作。
查看包含两个案例的片段。
#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
using boost::filesystem;
path relativePath("foo");
path canonical_path = weakly_canonical(relativePath);
path abs_canonical_path = weakly_canonical(absolute(relativePath));
std::cout << "Using weakly_canonical: "
<< canonical_path.string()
<< std::endl;
std::cout << "Using weakly_canonical and absolute: "
<< abs_canonical_path.string()
<< std::endl;
例如,如果 current_path 是“C:\path\to\some\folder”,我将获取:
- 相对路径 = "./foo"
Using weakly_canonical: C:\path\to\some\folder\foo
Using weakly_canonical and absolute: C:\path\to\some\folder\foo
- 相对路径 = "../foo"
Using weakly_canonical: C:\path\to\some\foo
Using weakly_canonical and absolute: C:\path\to\some\foo
- 相对路径 = "foo"
Using weakly_canonical: foo
Using weakly_canonical and absolute: C:\path\to\some\folder\foo
最后一个例子让我感到困惑,因为我希望weakly_canonical也能在当前工作目录前面加上。
同时使用absolute和weakly_canonical是否正确?或者我滥用weakly_canonical?
最佳答案
Documentation说:“返回:由调用 canonical
函数的结果组成的路径,该路径由存在的 p
的前导元素(如果有)组成由 p
中不存在的元素(如果有)组成。”
重要的是,只有当 p
的前导元素实际存在时,才会调用 canonical
(它确实构造了绝对路径)。
如果您在第一个元素不存在的相对路径上调用 weakly_canonical
,则不会调用 canonical
,并且如果使用点,则以下部分将被标准化。
因此,如果此路径不存在,则 weakly_canonical("foo")
可以返回 foo
存在或绝对路径(如果存在)。
对于我可以测试的 std::filesystem::weakly_canonical
的不同实现,此行为是相同的。
如果您想确保规范路径具有绝对形式,可以在 weakly_canonical
之后调用 absolute
:
boost::filesystem::absolute(boost::filesystem::weakly_canonical("foo"))
关于c++ - Boost 文件系统weakly_canonical 无法解析没有父文件夹的相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058037/