使用QSaveFile类安全的读写文件
来源:互联网 发布:wpx软件是什么 编辑:程序博客网 时间:2024/05/21 09:48
QSaveFile类也是一种I/O设备,来用来读写文本文件和二进制文件,但使用该类的话,在写入操作失败时不会导致已经存在的数据丢失。
该类在执行写操作时,会先将内容写入到一个临时文件中,如果没有错误发生,我们可以在最后调用其成员函数commit()来将临时文件中的内容移到目标文件中。这能确保目标文件中的数据在写操作发生错误时不会丢失数据,也不会出现部分写入的情况。所以,一般使用QSaveFile类向磁盘上保存整份文档。
QSaveFile会自动的检测写入过程中所出现的错误,例如无法写入全部的数据。它会记得有错误发生,并在commit()时放弃临时文件。
至于该类的使用,和QFile类似,使用open()函数打开文件,使用QDataStream或QTextStream类进行读写,也可以使用从QIODevice继承的函数read(),readLine(),write()等。但不同的是,不能调用close()函数,而应该调用commit()函数。如果没有调用commit()函数,则QSaveFile对象销毁时,会丢弃临时文件。
当然,当应用程序出错时,我们也可以主动放弃写入的数据,只要调用cancelWriting()即可,这样,即使以后又调用了commit(),也不会发生真正的保存文件操作。
使用该类,我们也可以跳过临时文件,直接将数据写入到目标文件中。上面我们说过,QSaveFile类会在和目标文件的同一目录下创建一个临时文件,并自动的进行重命名。但如果该目录的权限限制不允许创建文件呢。通常,在这种情况下,open()调用会失败。而为了解决这个问题,即能让用户编辑一个现存的文件,而不创建新文件,可以调用setDirectWriteFallback(),为其传入true,这样,在接下来调用open()时就会退回到直接打开目标文件,并向其写入数据,而不会使用一个临时文件。但这也会失去QSaveFile提供的原子保证功能,即在写入出错的情况下,可能会导致部分写入的情况,并且会使cancelWriting()函数失效。
下面,我们使用一个例子来使用以下该类。
新建一个Qt控制台程序,代码如下:
#include <QCoreApplication>#include <QSaveFile>#include <QFile>#include <QDebug>int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QFile file("test.txt"); //QSaveFile file("test.txt"); if(!file.open(QIODevice::WriteOnly)) { return 0; } int i = 1; while(1) { QString str = QString("hello %1\n").arg(i++); file.write(str.toLocal8Bit()); qDebug() << str; } return a.exec();}
我们使用一个死循环往一个文件中写数据,如果我们在循环的过程中,直接退出程序,对于这种情况,如果我们使用的是QFile类,那么将会在磁盘上产生一个test.txt文件,里面存储的是程序退出前所写入的内容。如下:
而如果我们使用QSaveFile,那么将不会在磁盘上生成目标文件test.txt,而是会将这些数据存储到所生成的一个临时文件中:如下:
- 使用QSaveFile类安全的读写文件
- RandomAccessFile类的使用,随机读写文件。
- Android SharedPreferences安全存储/AutoCompleteTextView使用/文件读写
- QTextStream的使用 读写文件
- c++ 读写文件安全又简洁的方法
- java安全机制 控制文件的授权 读写控制
- C# 使用API读写Ini文件的类
- 使用CRichEditCtrl的stream功能读写文件
- 使用avilib进行avi文件的读写
- 使用jexcel读写excel文件的例子
- 使用C#读写外部的资源文件
- 18.7 文件读写的使用工具
- c,c++读写文件的使用整理
- 使用RandomAccessFile进行文件的读写
- 文件读写与NSInputStream的简单使用
- properties文件的读写使用例子
- 使用Java Io文件的读写
- C++ 使用读写文件的矩阵乘法
- android (神TM)存储与读取
- UITableViewCell嵌套UIWebView
- Sublime text 3 软件使用介绍及常用插件
- Mac多Python版本共存,多个独立Python开发环境切换。
- React学习之-(React-Event-Listener)
- 使用QSaveFile类安全的读写文件
- 加密术
- 【敏捷开发每日一贴】看板原理一:里特定律
- jQuery.parseJSON() 函数详解
- Array_using
- jackson的解析和序列化
- 分页
- [李景山php]每天laravel[034]-laravel 基础知识 --- 数据迁移及填充
- dp专题 第二十一题 三角形最佳路径