boost::filesystem::path::lexically_normal: 这是不正确的行为吗?

Posted

技术标签:

【中文标题】boost::filesystem::path::lexically_normal: 这是不正确的行为吗?【英文标题】:boost::filesystem::path::lexically_normal: is this incorrect behavior? 【发布时间】:2017-03-22 13:09:42 【问题描述】:

boost::filesystem::path::lexically_normal() 的文档指出:

返回*this,删除冗余的当前目录(点)、父目录(点-点)和目录分隔符元素。

请参阅:http://www.boost.org/doc/libs/1_63_0/libs/filesystem/doc/reference.html

以下打印 ./test(使用 Boost 1.63.0)我期望 test

#include <boost/filesystem/path.hpp>
#include <iostream>

int main(void)

   std::cout << boost::filesystem::path"./test".lexically_normal().string() << "\n";
   return 0;

所以第一个点元素不被认为是多余的。但是,test./test 在使用 boost 文件系统时显然都解析为同一个文件,所以这对我来说似乎不一致。这是预期的行为吗?

更新:C++17 文件系统库按预期返回"test"(GCC 8.2.0,Linux)。

【问题讨论】:

您在这里隐含地假设 test 是一个相对路径。这是可移植代码中的一个危险假设。 ./test 无疑是相对的。 这是一种 Unix 敏感性。几乎没有结束,植根于perms 的 0777 永远不会很好地移植到非 Unix 操作系统。 【参考方案1】:

这是合理的行为,因为尽管test./test 通常指的是同一个东西是对的,但并非所有地方都如此。

例如,如果您在 shell 中将 ./test 作为命令运行,它将始终在当前目录中查找该程序,而不是在其他任何地方。但是,如果您运行 test,它将改为查看运行时路径(例如 $PATH)。

所以test./test 是否引用同一个文件实际上取决于上下文——因此./ 不是多余的。

【讨论】:

我对此深信不疑,但我并不相信。 boost::filesystem 上下文中路径的使用不应依赖于上下文。我们处理的是文件系统路径,而不是终端命令。 @TonvandenHeuvel:我们是谁说Boost文件系统中使用了什么样的路径?我很确定有些人实际上会使用这个库来操作稍后在 shell 命令中使用的路径。当然,您可以随时查看 Boost Filesystem 中提供的单元测试,看看他们是否明确指出了这一结果。 感谢您的建议。我看了一下测试用例,没有覆盖点前缀。 仅供参考,在这种情况下,C++17 文件系统库确实返回 "test"(GCC 8.2.0/Linux)。

以上是关于boost::filesystem::path::lexically_normal: 这是不正确的行为吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何转换`boost :: filesystem :: path`和`QString`?

boost::filesystem::path::lexically_normal: 这是不正确的行为吗?

错误:'boost::filesystem::path::filename() const() + "/"' 中的'operator+' 不匹配

从'boost::filesystem3::path'到非标量类型'std::string'的提升错误转换

使用简单 Ls.cpp 的 C++ Boost 编译错误 - 未定义对 boost::filesystem::path::filename 的引用

为 cmake 添加 boost 编译库