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

标签 c++ c++11 c++17 c++-standard-library boost-filesystem

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

现在,我知道进入 C++17 的文件系统库是基于 Boost::Filesystem;但是 - 它们是否足够相似,让我可以使用 Boost 库,然后在以后无缝切换到标准版本,而无需更改超过,例如 using 语句?或者两者之间是否存在(微小/重大)差异?我知道对于 variant 的情况,Boost 和标准库的版本差别很大。

最佳答案

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

在这方面还有一个很好的最新消息:

  1. 支持non-POSIX-like filesystems :
    • 指定字符串是操作系统原生的还是类似 POSIX 的(或者让实现来决定,这(仍然)是默认值)
    • 一个实现可以定义其他文件类型(除了常规、目录、套接字、)
    • 实现可以为目录或设备文件定义 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 不兼容)。

关于c++ - Boost.Filesystem 和 C++ 标准文件系统库有多相似?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40899267/

相关文章:

c++ - 用来自另一个容器的迭代器填充一个容器

使用模板定义多个函数的 C++ 通用方法

c++ - 如何在没有轮询的情况下实现 std::when_any?

c++ - 2D线段树,矩形之和

c++ - 如何在 C++ 中使用 dll 文件?

c++ - C++11标准是否保证initializer_list对象的内存布局是交叉编译器兼容的?

c++ - 为什么扩展的 ASCII(特殊)字符需要 2 个字节才能存储?

c++ - 为什么不能使用结构化绑定(bind)分解 lambda 表达式的捕获列表

c++ - 可变大小数组类型 ‘int [size]’ 不是有效的模板参数

c++ - 整数到字符串优化函数?