使用QSaveFile类安全的读写文件(继承自QFileDevice,与QFile并列)
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,而是会将这些数据存储到所生成的一个临时文件中:如下:
---------------------
作者:求道玉
来源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/69942057
版权声明:本文为博主原创文章,转载请附上博文链接!
最新文章
- awk命令简介
- oracle忘记密码
- c++程序设计之编程思想
- raw,cow,qcow,qcow2镜像的比较
- r8 - ASC 41(俄罗斯多校)
- PL/SQL之--触发器
- JAXB - Annotations, Class Fields as Attributes: XmlAttribute
- 使用JUnit单元测试入门
- 猿取向的规划设计模式 ——GoF《设计模式》阅读摘要(零)
- Android FragmentStatePageAdapter的使用Demo
- 201521123027 <;java程序设计>;第十二周作业总结
- js 音乐播放器
- EF学习笔记(十二):EF高级应用场景
- 校园电商项目(1) 基于SSM
- maven(九),install安装到本地仓库
- DNS解析全过程分析
- zhaoyin
- 从django的序列化到rest-framework 序列化
- numpy 切片
- iOS开发--打印NSRange,CGRect等结构体
热门文章
- pc电源cpu插座和显卡插座
- REST架构原则初探
- 开发WINDOWS服务程序
- Flutter移动电商实战 --(39)路由_Fluro的路由配置和静态化
- MySQL查询获取行号rownum
- Linux笔记整理
- Webservice初体验:axis调用wsdl和document解析
- MySQL VARCHAR字段最大长度到底是多少
- lvs,nginx,haproxy的优缺点,适合场景
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_19-认证接口开发-接口开发-controller