现象
使用QFile类写数据到文件后,调用close()方法关闭并保存文件。
之后设备立即断电,重启后发现该文件并未成功保存,文件里的数据仍是以前的数据。
经检查,打开、写入都是成功的。
原因
Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率。
因此如果调用close()方法后设备立即断电,会产生实际数据并未保存在硬盘中的现象。
解决过程中遇到的问题
经查Qt帮助文档,发现QFile的父类QFileDevice有一个方法:flush()
bool QFileDevice::flush()
Flushes any buffered data to the file. Returns true if successful; otherwise returns false.
看说明是将缓存的数据写入到文件的意思。
因此尝试在close()之前先flush()。
但经测试后发现并不可靠,还是利用Linux的系统函数fsync(int fd)来解决吧。

本文介绍了一个Qt程序中确保文件数据正确保存的方法。针对使用QFile类写入数据后因突然断电导致数据丢失的问题,通过创建QFile的子类并在close()方法中调用fsync()系统函数来解决。

3010

被折叠的 条评论
为什么被折叠?



