2017-03-22 41 views
6

boost::filesystem::path::lexically_normal()状态的文档: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; 
} 

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

+0

你在这里隐含地假设'test'是一个相对路径。这在便携式代码中是一个危险的假设。 '。/ test'是明确的相对。 – MSalters

+1

这是一个Unix的感性。几乎没有它结束的地方,'perms'的0777永远不会转移到非Unix操作系统。 –

+0

@MSalters,不是普遍的OpenVMS。 –

回答

1

这是合理的行为,因为虽然你是正确的,test./test通常指的是相同的东西,但情况并非如此。

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

因此,test./test指的是相同的文件实际上取决于上下文 - 因此./不是多余的。

+0

我想到这一点,我不相信。 'boost :: filesystem'上下文中路径的使用不应该取决于上下文。我们正在处理文件系统路径,而不是终端命令。 –

+0

@TonvandenHeuvel:我们要说谁在Boost文件系统中使用了什么样的路径?我相当确定有些人实际上会使用这个库来操作稍后在shell命令中使用的路径。当然,您可以随时查看Boost Filesystem中提供的单元测试,看看他们是否明确注意到了这个结果。 –

+0

感谢您的建议。我看了一下测试用例,没有涉及点前缀。 –

相关问题