【发布时间】:2019-10-04 14:30:49
【问题描述】:
给定以下代码,
namespace fs = boost::filesystem;
fs::path parentPath("/home/user1/");
fs::path childPath("/home/user1/Downloads/Books");
std::cout << childPath.lexically_relative(parentPath) << '\n';
我希望输出是"Downloads/Books",但实际上是"../Downloads/Books"。如果我将 parentPath 更改为 "/home/user1"(删除尾随分隔符),我会得到预期的输出。
在我的 real 代码中,路径通常以字符串形式出现在数据中。在我的上下文中,末尾的斜杠是无意的,出于任何逻辑的目的都应该忽略。基本上,在我的程序中"/home/user1" 与"/home/user1/" 相同。然而boost::filesystem::path 的逻辑并没有反映这个断言。
所以我的问题有两个:
为什么尾随分隔符会影响行为?我只是不太明白为什么在这种情况下它会使用
".."来增加目录。如何让
path在我的程序中全局忽略或规范尾部斜杠?例如,在我构造path对象之前“清理”我的路径字符串会带来太多的维护负担,所以如果可能的话,我需要更固有的东西。
这是我一直用于测试的live sample。
【问题讨论】:
-
看起来像this might be a bug。
-
没有办法“配置”一个类来改变它的行为——这样的能力肯定会导致更糟糕的可维护性问题(并且可能会通过全局状态干扰线程)。您所能做的就是包装类和所有非成员函数(本身维护成本很高)或在任何地方使用“工厂”函数。
-
@DavisHerring 你在说什么?
-
“我怎样才能让
path在全局范围内忽略或规范化尾部斜杠[...]?”这将涉及设置某种会影响所有代码(包括库中的代码)的编译时或运行时选项,对吧? -
@DavisHerring 我明白你现在的意思了。是的,我想我们都明白这一点,这在我的问题中有所暗示(例如“全球”)。我认为您假设我可能已经知道不存在这样的“全局”选项,但出于某种原因还是决定询问。如果该选项不存在,它不存在,我们不需要深入研究为什么/为什么不在那一点上的原因。我试图让问题保持简单。无论如何,我发现这是一个错误,所以我的问题没有我正在寻找的答案。但是,我将其保留在这里以供参考,因为我确信其他人会遇到此问题。
标签: c++ boost-filesystem