如果文件被删除,C++ Catch
C++ Catch if the file was removed
我有一些循环运行并写入文件的基本代码。它看起来是这样的:
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++ 标准对在这种情况下会发生什么没有任何保证,所以我认为您需要使用特定于平台的 API 来测试文件在写入时是否仍然存在.
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() 根据 只需要 1 微秒多一点,因此不太可能对速度造成太大影响。
我有一些循环运行并写入文件的基本代码。它看起来是这样的:
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++ 标准对在这种情况下会发生什么没有任何保证,所以我认为您需要使用特定于平台的 API 来测试文件在写入时是否仍然存在.
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() 根据 只需要 1 微秒多一点,因此不太可能对速度造成太大影响。