我需要一个文件系统库与支持 C++11 的编译器或支持 C++14 的编译器一起使用 - 所以它不能来自 C++17。
现在,我知道进入 C++17 的文件系统库是基于 Boost::Filesystem 的;但是 - 它们是否足够相似,足以让我使用 Boost 库,然后在稍后无缝切换到标准版本,而无需进行更多更改,例如using
陈述?或者两者之间是否存在(微小/显着)差异?我知道对于以下情况variant
,Boost 和标准库版本差别很大。
有很多差异。我相信,有些是从未传播过的 Boost 更改。例如,没有path.filename_is_dot()
查询(如下所述,它在以下情况中用处不大:std::filesystem
反正)。
在这方面还有一些最新消息:
- Support for non-POSIX-like filesystems http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0430r2.pdf:
- 指定字符串是操作系统本机的还是类似 POSIX 的(或者让实现来决定,这仍然是默认值)
- 实现可以定义其他文件类型(除了常规、目录、套接字、etc.)
- 一个实现可以定义
file_size
对于目录或设备文件
-
filename(), normalization, and relative/absolute conversions redefined http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0492r2.html (examples for POSIX):
-
path("foo/.").lexically_normal()=="foo/"
(与Boost相反)
-
path("foo/").filename()==""
(is path(".")
在升压中)
-
remove_filename()
留下尾部斜杠,因此是幂等的(它分配parent_path()
在升压中)
-
path(".profile").extension()==""
(是Boost中的全名)
-
path
分解和组合可以保留诸如备用数据流名称 https://en.wikipedia.org/wiki/NTFS#Alternate_data_streams_.28ADS.29通常是看不见的
-
path("foo")/"/bar"=="/bar"
(is path("foo/bar")
在Boost中),它允许与其他文件名(绝对或相对)组合相对文件名并取代Boost的absolute()
- Boost's
system_complete()
(只需要一个参数)被重命名为absolute()
-
canonical()
因此只需要一个参数(固定在DR http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0699r0.html#2956)
-
lexically_relative()
把手..
和根元素正确
-
permissions()
需要更多参数(Boost 将它们组合成位掩码)
请注意,Boost.Filesystem v4 是正在开发中 https://github.com/boostorg/filesystem/commits/v4并且应该与 C++17 兼容(但因此在许多方面与 v3 不兼容)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)