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

How similar are Boost.Filesystem and the C++ standard filesystem library?

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

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

警告:此答案并未反映 C++17 最终确定之前的几个最后一刻更改。请参阅@DavisHerring 的回答。


Boost 文件系统插入器和提取器使用 & 作为 "& 的转义字符。

标准将使用std::quoted (which uses \ by default) to escape ", which in turn use \ to escape \, see this reference

Demo

这可能是它们之间唯一的区别。

可以在 N3399

找到造成这种差异的原因

有很多不同之处。我相信,有些是从未传播过的 Boost 更改。例如,没有 path.filename_is_dot() 查询(如下所述,无论如何它在 std::filesystem 中用处不大)。

这方面还有很多最新消息:

  1. 支持non-POSIX-like filesystems
    • 指定字符串是 OS-native 还是 POSIX-like(或者让实现决定,这是(仍然)默认的)
    • 实现可以定义其他文件类型(除了常规、目录、套接字之外,
    • 实现可以为目录或设备文件定义file_size
  2. filename(), normalization, and relative/absolute conversions redefined(POSIX 的示例):
    • path("foo/.").lexically_normal()=="foo/"(在Boost中正好相反)
    • path("foo/").filename()==""(在 Boost 中是 path(".")
    • remove_filename() 留下尾部斜杠,因此是幂等的(它在 Boost 中分配 parent_path()
    • path(".profile").extension()==""(是Boost中的全名)
    • path 分解和组合可以保留像 alternate data stream names 这样通常不可见的东西
    • path("foo")/"/bar"=="/bar"(在 Boost 中是 path("foo/bar")),它允许与其他文件名(绝对或相对)组成相对文件名并替换 Boost 的 absolute()
    • Boost 的 system_complete()(仅接受一个参数)重命名为 absolute()
    • canonical() 因此只接受一个参数(固定在 DR
    • lexically_relative() 正确处理 .. 和根元素
    • permissions() 需要更多参数(Boost 将它们组合成一个位掩码)

请注意 Boost.Filesystem v4 是 under development 并且应该与 C++17 兼容(但因此在许多方面与 v3 不兼容)。