c++ - Boost 文件系统weakly_canonical 无法解析没有父文件夹的相对路径

标签 c++ boost-filesystem

我想获得一个绝对规范路径,给定一个相对路径,并在 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”,我将获取:

  1. 相对路径 = "./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/

    相关文章:

    c++ - 罗伯特·吉塞克的非管理导出

    c++ - 为什么 std::filesystem::path::compare() 和 boost::filesystem::path::compare() 不同?

    c++ - 为什么 boost::asio::async_read 无法读取请求的字节数?

    c++ - 在 VS2015 中访问 std::any

    c++ - 使用 new 创建的 Vector 的操作

    c++ - 什么是使用 opencv::Mat 优化 c++ 矩阵计算

    c++ - 确定不打开文件的确切原因

    boost::filesystem exists() 在目录路径上失败,但 is_directory() 没问题

    c++ - 移除对 boost::filesystem::current_path() 的依赖

    c++ - boost 文件系统 copy_file "successful"但没有复制文件