gpt4 book ai didi

c++ - std::remove 和 boost::filesystem::remove 之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 21:12:51 33 4
gpt4 key购买 nike

在 C++17 文件系统库中,我们得到了 std::filesystem::remove(path),据我所知,它是 boost::的直接端口filesystem::remove(path) 来自 Boost.Filesystem。

但 C++ 从 C89 继承了一个非常相似的函数,称为 std::remove(path),它被记录为从文件系统中删除文件的方法。我隐约意识到这个功能的一些缺陷,例如我相信我听说在 Windows 上 std::remove 不能用于删除当前进程仍保持打开状态的文件。

std::filesystem::remove 是否通过 std::remove 解决了这些问题?我应该更喜欢 std::filesystem::remove 而不是 std::remove 吗?或者前者只是后者的命名空间同义词,具有相同的缺点和陷阱?

我的问题的标题询问了 boost::filesystem::remove(path)std::remove(path) 之间的区别,因为我认为 std::filesystem::remove(path) 可能还没有被许多库供应商实现,但我的理解是它应该基本上是 Boost 版本的直接拷贝。因此,如果您了解 Windows 上的 Boost.Filesystem,您可能也知道足以回答这个问题。

最佳答案

检查随我的 MSVC 安装的标准库源代码,std::experimental::filesystem::remove 调用其内部的 _Unlink 助手,它简单地调用 _wremove ,它只是调用 Windows DeleteFileW .同样,boost::filesystem::remove 也只是在 Windows 上调用 DeleteFileW


std::filesystem::remove is specified by reference to POSIX remove , 但在 [fs.conform.9945] 中的全局措辞明确表示不需要实现来提供确切的 POSIX 行为:

Implementations should provide such behavior as it is defined by POSIX. Implementations shall document any behavior that differs from the behavior defined by POSIX. Implementations that do not support exact POSIX behavior should provide behavior as close to POSIX behavior as is reasonable given the limitations of actual operating systems and file systems. If an implementation cannot provide any reasonable behavior, the implementation shall report an error as specified in [fs.err.report]. [ Note: [...] ]

Implementations are not required to provide behavior that is not supported by a particular file system. [ Example: [...] ]

::remove 中的任何怪癖(即关于删除的实际行为而不是要删除的文件的标识)可能是由于底层操作系统 API 的限制。我认为没有理由认为在同一操作系统上实现 std::filesystem::remove 会神奇地做得更好。

关于c++ - std::remove 和 boost::filesystem::remove 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46066263/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com