没有父文件夹的情况下,Boost文件系统weakly_canonical无法解析相对路径

时间:2019-05-09 11:07:20

标签: c++ boost-filesystem

我想获得一个给定的绝对规范路径,其中包含在Windows和Linux中都可以使用的boost文件系统的相对路径。我希望它也适用于不存在的路径。

我正在使用从boost 1.60开始可用的weakly_canonical(path relativePath)。但它的行为不符合预期(至少在Windows中)。

当传递没有父文件夹的相对路径(即原始文件名或文件夹名称,例如“ foo”)时,weakly_canonical返回相同的未修改路径(在这种情况下为“ foo”),而absolute(path relativePath)则在当前路径之前(如我所料)(“ current_dir / foo”)。

因此,最后,我不得不先调用绝对值,然后再调用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”,则表示:

  1. relativePath =“ ./foo”

使用weakly_canonical:C:\ path \ to \ some \ folder \ foo 使用weakly_canonical和绝对值:C:\ path \ to \ some \ folder \ foo

  1. relativePath =“ ../ foo”

使用weakly_canonical:C:\ path \ to \ some \ foo 使用weakly_canonical和绝对值:C:\ path \ to \ some \ foo

  1. relativePath =“ foo”

使用weak_canonical:foo 使用weakly_canonical和绝对值:C:\ path \ to \ some \ folder \ foo

这最后一种情况令我感到困惑,因为我希望“ weakly_canonical”也位于当前工作目录的前面。

同时使用absolute_canonical和canonical_canonical是否正确?还是我在滥用weakly_canonical?

2 个答案:

答案 0 :(得分:0)

好吧,documentation说:“ 返回符号链接已解析且结果归一化的p ”,这并不是说它将构成完整路径。您的“ foo”在路径中没有符号链接和点。

答案 1 :(得分:0)

Documentation 说:“返回:一个路径,由调用 canonical 函数的结果组成,该路径由存在的 p 的前导元素组成,如果有的话, 后跟不存在的 p 元素(如果有)。"

重要的一点是,只有当 canonical 的前导元素实际存在时,才会调用 p(它确实构造了一个绝对路径)。

如果您在第一个元素不存在的相对路径上调用 weakly_canonical,则不会调用 canonical,如果使用点,则后面的部分只是标准化。 所以 weakly_canonical("foo") 可以返回 foo 如果这条路径没有 存在或绝对路径(如果确实存在)。

对于我可以测试的 std::filesystem::weakly_canonical 的不同实现,这种行为是相同的。

如果您想确保具有绝对形式的规范路径,您可以在 absolute 之后调用 weakly_canonical

boost::filesystem::absolute(boost::filesystem::weakly_canonical("foo"))