【问题标题】:C++ Catch if the file was removed如果文件被删除,C++ 捕获
【发布时间】:2016-03-07 18:27:32
【问题描述】:

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

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() 会起作用,因为我希望它设置故障位,但行为似乎没有改变。我究竟做错了什么?

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

【问题讨论】:

    标签: c++ ofstream


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-11-30
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 2023-02-10
        • 2019-08-02
        相关资源
        最近更新 更多