为什么尾随分隔符会改变 Boost.Filesystem 中相对路径转换的行为?
Why do trailing separators change the behavior of relative path conversions in Boost.Filesystem?
给定以下代码,
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"
(删除尾随分隔符),我会得到预期的输出。
在我的 真实 代码中,路径通常以来自数据的字符串形式出现。在我的上下文中,末尾的尾部斜杠是无意的,出于任何逻辑目的都应忽略。基本上,在我的程序中 "/home/user1"
与 "/home/user1/"
相同。然而 boost::filesystem::path
的逻辑并不反映这个断言。
所以我的问题有两个:
为什么尾随分隔符会影响行为?我只是不太明白为什么在这种情况下它会使用 ".."
升级目录。
如何让 path
在我的程序中全局忽略或规范化尾部斜杠?例如,在构造 path
对象之前 "sanitizing" 我的路径字符串会造成过多的维护负担,因此如果可能,我需要一些更固有的东西。
这是我用来测试的live sample。
我在发布这个问题后不久发现这是一个错误,reported here。我最初以为我可能做错了什么。尽管此时我的问题没有多大意义,但我不想删除它以防其他人 运行 遇到同样的问题。
给定以下代码,
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"
(删除尾随分隔符),我会得到预期的输出。
在我的 真实 代码中,路径通常以来自数据的字符串形式出现。在我的上下文中,末尾的尾部斜杠是无意的,出于任何逻辑目的都应忽略。基本上,在我的程序中 "/home/user1"
与 "/home/user1/"
相同。然而 boost::filesystem::path
的逻辑并不反映这个断言。
所以我的问题有两个:
为什么尾随分隔符会影响行为?我只是不太明白为什么在这种情况下它会使用
".."
升级目录。如何让
path
在我的程序中全局忽略或规范化尾部斜杠?例如,在构造path
对象之前 "sanitizing" 我的路径字符串会造成过多的维护负担,因此如果可能,我需要一些更固有的东西。
这是我用来测试的live sample。
我在发布这个问题后不久发现这是一个错误,reported here。我最初以为我可能做错了什么。尽管此时我的问题没有多大意义,但我不想删除它以防其他人 运行 遇到同样的问题。