记录昨天遇到的一个问题,在linux下保存文件内容突然间断电,导致文件内容没有及时同步到硬盘的问题,以及在修改数据库修改成功的同时,断电没能成功存储到数据库表格中。
解决办法:
1、文件的处理
利用fsync函数同步内存中所有已修改的文件数据到储存设备,fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。
2、数据库处理
同样可以适用于数据库,在数据库操作完成后,调用fsync()函数或者sync()函数,sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。
3、函数的原型:
(1)、int fsync(int __fd),参数__fd是打开文件的文件描述符,函数执行成功返回0,反之为-1;
(2)、int sync(void), 函数执行成功依旧返回0。
4、头文件:#include "unistd.h"
参考代码如下:
#include "unistd.h"
#include <QFile>
bool layoutWidget::saveFile(QString fileName)
{
//打开文件
if(fileName.isEmpty())
{
cout << "file is empty!";
return false;
}
QFile file;
file.setFileName(fileName);
if(!file.exists())
{
cout << "file is not exists!";
return false;
}
if(!file.open(QFile::ReadWrite))
{
cout << "open file error!";
return false;
}
//对文件进行操作
//do what you want...
//fsync原型: int fsync(int __fd)
//handle()获取文件句柄
fsync(file.handle());
file.close();
return true;
}