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。
这可能是它们之间唯一的区别。
可以在 N3399
找到造成这种差异的原因
有很多不同之处。我相信,有些是从未传播过的 Boost 更改。例如,没有 path.filename_is_dot()
查询(如下所述,无论如何它在 std::filesystem
中用处不大)。
这方面还有很多最新消息:
- 支持non-POSIX-like filesystems:
- 指定字符串是 OS-native 还是 POSIX-like(或者让实现决定,这是(仍然)默认的)
- 实现可以定义其他文件类型(除了常规、目录、套接字之外,等)
- 实现可以为目录或设备文件定义
file_size
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++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。
这可能是它们之间唯一的区别。
可以在 N3399
找到造成这种差异的原因有很多不同之处。我相信,有些是从未传播过的 Boost 更改。例如,没有 path.filename_is_dot()
查询(如下所述,无论如何它在 std::filesystem
中用处不大)。
这方面还有很多最新消息:
- 支持non-POSIX-like filesystems:
- 指定字符串是 OS-native 还是 POSIX-like(或者让实现决定,这是(仍然)默认的)
- 实现可以定义其他文件类型(除了常规、目录、套接字之外,等)
- 实现可以为目录或设备文件定义
file_size
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 不兼容)。