C++ QFile/QTextStream don';t在写入删除文件时显示错误

C++ QFile/QTextStream don';t在写入删除文件时显示错误,c++,file,qfile,qtextstream,C++,File,Qfile,Qtextstream,我正在使用QTextStream向一个QFile写入,所有这些都非常有效。我试图创建一些错误检测,所以我尝试在写入之间删除输出文件 扼杀,Qtextstream的状态继续显示为0(无错误),QFile的error方法返回0。然而文件不见了,写的文字也不见了……不见了 发生什么事了?如何检测写入失败?我看到的是错误的方法吗?对Windows不太清楚,但在Linux和大多数Unix类型的系统上,从操作系统的角度来看,您描述的场景根本不是一个错误-继续写入已删除的文件是完全合法的(而且“有效”),数据

我正在使用QTextStream向一个QFile写入,所有这些都非常有效。我试图创建一些错误检测,所以我尝试在写入之间删除输出文件

扼杀,Qtextstream的状态继续显示为0(无错误),QFile的error方法返回0。然而文件不见了,写的文字也不见了……不见了


发生什么事了?如何检测写入失败?我看到的是错误的方法吗?

对Windows不太清楚,但在Linux和大多数Unix类型的系统上,从操作系统的角度来看,您描述的场景根本不是一个错误-继续写入已删除的文件是完全合法的(而且“有效”),数据仍然被洗牌到文件系统中/从文件系统中洗牌-此文件仍然在文件系统中,直到最后一个句柄关闭)

(我相信,在Windows上,如果您在文件使用时尝试删除该文件,至少如果该文件是以默认打开模式打开的,您会收到一个错误,但不是100%确定。)


如果您需要检查“文件已删除”,您需要自己编写这些检查。

至少显示删除和回写的代码部分。如何检查文件已删除?(这是在Linux下)。是否有一个与Qfile关联的函数告诉我这个文件仍然存在(而不仅仅是一个同名的文件)?我担心的是,因为这是一个日志文件,所以logrotate(或类似的东西)有可能会创建一个同名文件…所以我需要检查这个文件…这实际上相对来说比较难正确执行。一种方法是使用
handle()
获取底层C文件描述符,然后使用
fstat
获取底层C文件描述符。如果
st_nlink
为零,则删除该文件(在fs层次结构中不可见)。如果非零(文件可能已被移动),请将
st_dev
st_ino
与文件名的
stat()
进行比较。如果它们不匹配,则文件已“旋转”。我相信logrotate可以被设置为在它工作时向应用程序发送信号。这可能是解决这个问题最明智的方法。哦,另一个不用担心的明显方法是在需要登录时重新打开文件。“除非你的日志记录率很高,否则这很可能是最好的解决方案,”米歇尔说。