QFile / QTextStream 在写入删除文件时不显示错误

Posted

技术标签:

【中文标题】QFile / QTextStream 在写入删除文件时不显示错误【英文标题】:QFile / QTextStream don't show error on delete file being written to 【发布时间】:2013-10-03 04:32:40 【问题描述】:

我正在使用 QTextStream 写入 QFile,并且一切正常。我正在尝试创建一些错误检测,因此我尝试在写入之间删除输出文件。

绞死,Qtextstream的状态继续显示0(没有错误),QFile的error方法返回0。然而文件不见了,写入的文本正在丢失……不见了

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

【问题讨论】:

至少显示删除和回写的代码部分。 【参考方案1】:

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

(我相信在 Windows 上,如果您尝试删除正在使用的文件,至少如果它以默认打开模式打开,您会收到错误消息 - 虽然不是 100% 肯定。)

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

【讨论】:

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

以上是关于QFile / QTextStream 在写入删除文件时不显示错误的主要内容,如果未能解决你的问题,请参考以下文章

Qt笔记——QFile,QDataStream,QTextStream

QFile 和 QTextStream 帮助(使用用户名、密码和名称为用户编写 ID)

如何实现 qt 中qfile写出的文本 设置为unicode编码 在线等 谢谢。。。

6.3.1 读写文本示例

1-QT-文件操作

6.4 QTextStream处理文件数据流