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

pkln4tw6  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(301)

我需要一个文件系统库,用于支持C11或C14的编译器-所以它不能来自C17。
现在,我知道进入C
17的文件系统库基于Boost::Filesystem;但是,它们是否足够相似,可以让我使用Boost库,然后在以后无缝地切换到标准版本,而不需要改变更多,比如说,using语句?两者之间是否存在(轻微/显著)差异?我知道对于variant来说,Boost和标准库版本有很大的不同。

plicqrtu

plicqrtu1#

有许多不同之处。我相信,有些是从未传播过的Boost更改。例如,没有path.filename_is_dot()查询(如下所述,无论如何,它在std::filesystem中都不太有用)。
在这方面,还有一个很好的最新消息:

  • 支持non-POSIX-like filesystems
  • 指定一个字符串是OS原生的还是POSIX类的(或者让实现来决定,这(仍然)是默认的)
  • 实现可以定义附加的文件类型(除了常规、目录、套接字 * 等 * 之外)
  • 一种实现可以为目录或设备文件定义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()
  • Boost的system_complete()(只接受一个参数)被重命名为absolute()
  • 因此canonical()只接受一个参数(在DR中固定)
  • lexically_relative()正确处理..和根元素
  • permissions()接受更多参数(Boost将它们组合成位掩码)

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

9fkzdhlc

9fkzdhlc2#

**警告:**这个答案并不反映C++17最终确定之前的几个最后一刻的变化。看看@DavisHerring的回答。

Boost文件系统插入器和提取器使用&作为"&的转义字符。
该标准将使用std::quoted(默认使用\)来转义",然后使用\\来转义\,参见this reference
Demo
这可能是他们之间唯一的区别。
可以在N3399中找到这种差异的原因

zz2j4svz

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**
}

相关问题