C++ 如果文件被删除,则捕获

C++ Catch if the file was removed

本文关键字:删除 如果 文件 C++      更新时间:2023-10-16

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

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 << "Errorn";
    }
}

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

但是,如果我让程序循环写入文件,然后我手动继续删除该文件......程序似乎继续写入文件,就好像它仍然存在一样。不会引发任何错误。我认为也许使用 flush() 会起作用,因为我希望它会设置故障位,但行为似乎没有改变。我做错了什么?

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

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

C++17 具有包含 exists 方法的 std::文件系统。 或者你可以将 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 微秒多一点,因此不太可能对速度造成太大影响。

相关文章: