【发布时间】:2018-02-14 09:59:09
【问题描述】:
在 C++17 文件系统库中,我们得到了 std::filesystem::remove(path),据我了解,它是来自 Boost.Filesystem 的 boost::filesystem::remove(path) 的直接端口。
但 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,您可能也知道足以回答这个问题。
【问题讨论】:
-
在 Windows 上检查
boost::filesystem::remove的来源需要一分钟才能知道它是 simply callsDeleteFileW。 -
filesystem函数可以处理一般的 Unicode 路径,当您小心时。特别是,对于当前的实现,不要依赖从 UTF-8 的默认转换,而是明确地这样做。旧的std::remove仅限于狭窄的执行字符集,我真诚地怀疑任何Windows 实现都检测到该执行字符集是UTF-8(因为即使filesystem实现也无法检测到这一点)。所以在 Windows 中它只能处理来自 Windows ANSI 字符的路径,这是系统特定的编码。 -
@Cheersandhth.-Alf:Windows C++ 实现如何检测“执行字符集”是 UTF-8?该实现要么定义自己的执行集(不需要检测),要么遵从 Windows(不允许 UTF-8 作为默认字符集)。
-
@MSalters:UTF-8 产生了非常独特的数据。检查
"pøh"的字节应该足够了。所以对于内联代码的情况来说是微不足道的。 -
@MSalters:“Windows(不允许 UTF-8 作为默认字符集)”是错误的。 Windows 不支持 UTF-8 语言环境。但是 Windows 的主要编译器 g++ 和 Visual C++ 都支持 UTF-8 作为执行字符集,而 g++ 是默认的。我猜这些编译器的插件替代品,即 clang 和 Intel,行为相同。
标签: c++ visual-studio boost file-handling