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 的引用