我需要一个文件系统库,用于支持C11或C14的编译器-所以它不能来自C17。现在,我知道进入C17的文件系统库基于Boost::Filesystem;但是,它们是否足够相似,可以让我使用Boost库,然后在以后无缝地切换到标准版本,而不需要改变更多,比如说,using语句?两者之间是否存在(轻微/显著)差异?我知道对于variant来说,Boost和标准库版本有很大的不同。
using
variant
plicqrtu1#
有许多不同之处。我相信,有些是从未传播过的Boost更改。例如,没有path.filename_is_dot()查询(如下所述,无论如何,它在std::filesystem中都不太有用)。在这方面,还有一个很好的最新消息:
path.filename_is_dot()
std::filesystem
file_size
filename()
path("foo/.").lexically_normal()=="foo/"
path("foo/").filename()==""
path(".")
remove_filename()
parent_path()
path(".profile").extension()==""
path
path("foo")/"/bar"=="/bar"
path("foo/bar")
absolute()
system_complete()
canonical()
lexically_relative()
..
permissions()
请注意,Boost.Filesystemv4是under development,应该是C++17兼容的(但因此在许多方面与v3不兼容)。
9fkzdhlc2#
**警告:**这个答案并不反映C++17最终确定之前的几个最后一刻的变化。看看@DavisHerring的回答。
Boost文件系统插入器和提取器使用&作为"和&的转义字符。该标准将使用std::quoted(默认使用\)来转义",然后使用\\来转义\,参见this reference。Demo这可能是他们之间唯一的区别。可以在N3399中找到这种差异的原因
&
"
std::quoted
\
\\
zz2j4svz3#
另一个令人讨厌的区别:
if (!std::filesystem::exists("/I/dont/exist", error)) { if (error) <-- this is **false** } if (!boost::filesystem::exists("/I/dont/exist", error)) { if (error) <--- this is **true** }
3条答案
按热度按时间plicqrtu1#
有许多不同之处。我相信,有些是从未传播过的Boost更改。例如,没有
path.filename_is_dot()
查询(如下所述,无论如何,它在std::filesystem
中都不太有用)。在这方面,还有一个很好的最新消息:
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
分解和组合可以保留通常不可见的备用数据流名称等内容path("foo")/"/bar"=="/bar"
(在Boost中是path("foo/bar")
),它允许将相对文件名与其他文件名(绝对或相对)组合,并取代Boost的absolute()
system_complete()
(只接受一个参数)被重命名为absolute()
canonical()
只接受一个参数(在DR中固定)lexically_relative()
正确处理..
和根元素permissions()
接受更多参数(Boost将它们组合成位掩码)请注意,Boost.Filesystemv4是under development,应该是C++17兼容的(但因此在许多方面与v3不兼容)。
9fkzdhlc2#
**警告:**这个答案并不反映C++17最终确定之前的几个最后一刻的变化。看看@DavisHerring的回答。
Boost文件系统插入器和提取器使用
&
作为"
和&
的转义字符。该标准将使用
std::quoted
(默认使用\
)来转义"
,然后使用\\
来转义\
,参见this reference。Demo
这可能是他们之间唯一的区别。
可以在N3399中找到这种差异的原因
zz2j4svz3#
另一个令人讨厌的区别: