C ++ Catch如果文件被删除

时间:2016-03-07 18:27:32

标签: c++ ofstream

我有一些在循环中运行并写入文件的基本代码。它看起来像是:

std::ofstream myFile;
myFile.open("file.txt", std::ofstream::out);
while (true)
{
    if (myFile.is_open() && myFile.good())
    {
        myFile << "test" <<std::endl;
    }
    if (myFile.fail())
    {
        std::cout << "Error\n";
    }
}

如果我手动插入myFile.setstate()并将其设置为失败,那么一切正常并且出错。

但是,如果我让程序在循环中写入文件然后我手动继续删除文件......程序似乎继续写入文件,就像它仍然存在一样。不会抛出任何错误。我想也许使用flush()会起作用,因为我期望它设置failbit,但行为似乎没有改变。我究竟做错了什么?

有没有办法检查文件是否突然丢失,而不是试图再次尝试调用open()? (我试图在循环中避免使用.open()和.close()。而是在开始时打开,然后在超出范围时关闭它。)

2 个答案:

答案 0 :(得分:6)

我不相信这是一种可移植的方法。许多操作系统的设计使得如果删除正在写入的文件,该文件将被删除但仍然存在,直到写入它的最后一个程序关闭。其他人甚至不会删除正在写入的文件。 C ++标准对这种情况下应该发生的事情没有任何保证,所以我认为您需要使用特定于平台的API来测试文件是否仍然存在,因为您正在编写它。

答案 1 :(得分:0)

C ++ 17的std :: filesystem包含一个exist方法。或者,您可以将boost :: filesystem与较旧的编译器结合使用。

#ifdef __cpp_lib_filesystem
  #include <filesystem>
  namespace FS = std::filesystem;
#else
  #include <boost/filesystem.hpp>
  namespace FS = boost::filesystem;
#endif

在循环开始时:

  if(myFile.is_open() && !FS::exists("file.txt"))
  {
    myFile.close();
    myFile.open("file.txt", std::ofstream::out | std::ofstream::app);
  }

boost :: filesystem :: exists使用:: stat(),根据https://stackoverflow.com/a/12774387/69231的使用仅需1微秒,因此不太可能对速度造成太大影响。