Qt on Android - 解决QFile关闭文件后立即断电,文件丢失,数据未保存问题

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

现象

使用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)来解决吧。

fsync

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值