Boost文件系统和标准C++文件系统库有多相似?

ein*_*ica 24 c++ c++-standard-library boost-filesystem c++11 c++17

我需要一个文件系统库,用于支持C++ 11的编译器或支持C++ 14的编译器 - 所以它不能来自C++ 17.

现在,我知道进入C++ 17的文件系统库是基于Boost :: Filesystem的; 但是 - 它们是否足够相似,我可以使用Boost库,然后在以后无缝切换到标准版本,而不会更改,比如using声明?或两者之间是否存在(轻微/重大)差异?我知道,对于这种情况variant,Boost和标准库版本有很大不同.

Dav*_*ing 15

有许多不同之处.我相信,有些人是从未传播的促进变革.例如,没有path.filename_is_dot()查询(如下所述,它无论如何都不太有用std::filesystem).

在这方面还有一些最新消息:

  1. 支持非POSIX类文件系统:
    • 指定字符串是OS本机还是POSIX(或者让实现决定,哪个(仍然是默认值))
    • 实现可以定义其他文件类型(超出常规,目录,套接字)
    • 实现可以定义file_size目录或设备文件
  2. filename(),规范化和相对/绝对转换重新定义(POSIX的示例):
    • path("foo/.").lexically_normal()=="foo/" (与Boost相反)
    • path("foo/").filename()==""(path(".")在Boost中)
    • remove_filename()留下尾随斜杠,因此是幂等的(它指定parent_path()了Boost)
    • path(".profile").extension()=="" (是Boost中的全名)
    • path分解和组合可以保留通常不可见的备用数据流名称
    • path("foo")/"/bar"=="/bar"(path("foo/bar")在Boost中),它允许与其他人(绝对或相对)组成相对文件名并替换Boostabsolute()
    • Boost system_complete()(只接受一个参数)被重命名为absolute()
    • canonical()因此只需要一个参数(在DR中修复)
    • lexically_relative()句柄..和根元素正确
    • permissions() 需要更多参数(Boost将它们组合成一个位掩码)

请注意,Boost.Filesystem v4 正在开发中,并且应该与C++ 17兼容(但因此在许多方面与v3不兼容).


Dan*_*anh 6

警告:这个答案并没有反映C++ 17最终确定之前的几个最后更改.请参阅@ DavisHerring的回答.


升压文件系统插入器和提取使用&作为转义字符"&.

该标准将使用std::quoted(\默认情况下使用)进行转义",而这又用于\\转义\,请参阅此参考.

演示

这可能是他们之间唯一的区别.

这种差异的原因可以在N3399找到