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
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. awk命令简介
  2. oracle忘记密码
  3. c++程序设计之编程思想
  4. raw,cow,qcow,qcow2镜像的比较
  5. r8 - ASC 41(俄罗斯多校)
  6. PL/SQL之--触发器
  7. JAXB - Annotations, Class Fields as Attributes: XmlAttribute
  8. 使用JUnit单元测试入门
  9. 猿取向的规划设计模式 ——GoF《设计模式》阅读摘要(零)
  10. Android FragmentStatePageAdapter的使用Demo
  11. 201521123027 &lt;java程序设计&gt;第十二周作业总结
  12. js 音乐播放器
  13. EF学习笔记(十二):EF高级应用场景
  14. 校园电商项目(1) 基于SSM
  15. maven(九),install安装到本地仓库
  16. DNS解析全过程分析
  17. zhaoyin
  18. 从django的序列化到rest-framework 序列化
  19. numpy 切片
  20. iOS开发--打印NSRange,CGRect等结构体

热门文章

  1. pc电源cpu插座和显卡插座
  2. REST架构原则初探
  3. 开发WINDOWS服务程序
  4. Flutter移动电商实战 --(39)路由_Fluro的路由配置和静态化
  5. MySQL查询获取行号rownum
  6. Linux笔记整理
  7. Webservice初体验:axis调用wsdl和document解析
  8. MySQL VARCHAR字段最大长度到底是多少
  9. lvs,nginx,haproxy的优缺点,适合场景
  10. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_19-认证接口开发-接口开发-controller