【问题标题】:Boost filesystem weakly_canonical does not resolve relative paths without parent foldersBoost filesystem weakly_canonical 不解析没有父文件夹的相对路径
【发布时间】:2019-05-09 11:07:20
【问题描述】:

我想获得一个绝对规范路径,给定一个在 windows 和 linux 中都使用的带有 boost 文件系统的相对路径。我希望它也适用于不存在的路径。

我正在使用自 boost 1.60 起可用的 weakly_canonical(path relativePath) 来做到这一点。但它的行为不像预期的那样(至少在 Windows 中)。

当传递没有父文件夹的相对路径时,即原始文件名或文件夹名称,例如“foo”,weakly_canonical 返回相同的未触及路径(在本例中为“foo”),而 absolute(path relativePath) 将当前路径放在前面到它(如我所料)(“current_dir/foo”)。

所以最后,我不得不先调用 absolute ,然后调用 weakly_canonical 以使其工作。

查看包含这两种情况的 sn-p。

#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"
Using weakly_canonical: C:\path\to\some\folder\foo
Using weakly_canonical and absolute: C:\path\to\some\folder\foo
  1. relativePath = "../foo"
Using weakly_canonical: C:\path\to\some\foo
Using weakly_canonical and absolute: C:\path\to\some\foo
  1. relativePath = "foo"
Using weakly_canonical: foo
Using weakly_canonical and absolute: C:\path\to\some\folder\foo

最后一种情况让我感到困惑,因为我希望weakly_canonical 也会预先添加当前的工作目录。

absolute 和weakly_canonical 一起使用是否正确?还是我滥用了weakly_canonical?

【问题讨论】:

    标签: c++ boost-filesystem


    【解决方案1】:

    好吧,documentation 说“返回 p 并解析符号链接并将结果归一化”它并没有说它会生成完整路径。您的“foo”没有符号链接,路径中也没有点。

    【讨论】:

    • 文档更明确地说:“返回:一条路径由调用规范函数的结果组成,该路径由 p 的前导元素组成,如果有的话,后跟p 不存在,如果有的话”,并且规范函数说:“将必须存在的 p 转换为没有符号链接、点或点-点元素的绝对路径”。所以我知道weakly_canonical 应该是完整的路径。我错了吗?
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 2020-11-12
      • 2011-04-25
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2015-11-08
      • 2015-03-25
      • 2019-10-15
      相关资源
      最近更新 更多