C++ 如果文件被删除,则捕获
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 << "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 微秒多一点,因此不太可能对速度造成太大影响。
相关文章:
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- C++类析构函数删除成员(如果"owner"?
- 如果方法在类中定义,则阻止编译器删除方法
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 如果未声明,则由预处理器删除thread::hardware_concurrency
- 删除 QGraphicsPixmapItem (如果它已添加到场景中).如果不添加到场景
- 如果一个类继承了一个带有虚拟 dtor 的类,为什么要删除一个没有虚拟 dtor 的类是可以的
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 如果为空,则从 QListWidget 中删除可编辑项目
- 如果我从single_digits[*num - '0']]中删除'0',为什么这个程序会崩溃)
- 免费/删除 - 如果我不打电话怎么办