为什么文件的std :: remove总是返回-1?

时间:2019-07-02 18:06:12

标签: c++ windows

我正在尝试删除文件(如果存在)。因此,首先我测试文件是否存在,是否使用const Root = document.documentElement // ... Root.style.setProperty('--ImgWith', '50px') 将其删除。 test.json包含一些与json相关的txt。我还包括std::remove

#include <cstdio>

我原以为ret val是 std::string file_to_remove = "test.json"; std::ifstream f(file_to_remove.c_str()); if (f.good()) { int val = std::remove(file_to_remove.c_str()); std::cout << "\nRemoving file : " << file_to_remove << " : ret val : " << val<< std::endl; } ,但我得到0

我当前的输出是:

  

删除文件:test.json:ret val:-1

我还确保了文件已关闭。

2 个答案:

答案 0 :(得分:4)

您尝试删除打开的文件。

在Posix系统(例如Linux)中,可以删除打开的文件。它将继续存在于磁盘上,并且只要打开就可以使用,但是由于目录条目已被删除,因此它对其他人不可见。当您关闭文件时,该文件将消失。

在Windows中,您无法删除打开的文件。使用perrorGetLastError检查错误代码。

答案 1 :(得分:4)

摘自std::remove()(重点是我)的文档:

  

如果当前正在通过此过程或其他过程打开文件,则此功能的行为是实现定义的(特别是POSIX系统会取消链接文件名,尽管不会回收文件系统空间直到最后一个正在运行的进程关闭文件; Windows不允许删除文件)。

表示如果文件已打开,则在Windows上不会删除文件。它将返回错误(例如-1)。

由于定义了实现,因此任何其他平台实际上都可以是任何东西。我会研究您的平台/编译器,看看在打开的文件上调用std::remove()的结果是什么。

  

添加f.close()之后;在std :: remove ret val之前现在为0

这很有意义,因为f.close()关闭了文件。文件已关闭,可以将其删除。