Qt文件系统源码分析—第二篇QSaveFile

news2025/1/11 4:42:47

范围

深度

首先指定深度分析深度,否者会陷入代码海洋之中。

本文只分析到Win32 API/Windows Com组件/STL库函数层次,再下层代码不做探究

本文主要了解QSaveFile及其具体实现,使用到父类数据的地方只讨论关键点

QT Private

大部分Qt类有一个类名+Private构成的类,这个类主要用于保存数据、具体实现类功能

比如QObject具有QObjectPrivate来实现具体功能,QFile具有QFilePrivate来实现文件读写

这种数据方式是为了更新时不用动导出的头文件,使程序变更Qt版本时不用做任何修改,直接通过编译

QSaveFile

QSaveFile作用

安全写入文件。保证文件要么全部修改,要么没有修改,不会出现只写一部分情况。

用例

#include <QSaveFile>

#include <QByteArray>

#include <QDebug>

int main(int argc, char* argv[])

{

    QSaveFile file("D:/1.txt");

    if (file.open(QIODevice::WriteOnly))

    {

        file.write("Hello QFile!");

    }

    file.commit();

    return 0;

}

数据变量

QSaveFile本身没有添加的成员变量,所有成员变量全部继承自父类

QSaveFile中具有来自QObject的成员变量d_ptr,其类型为QObjectData指针,d_ptr指向QObjectPrivate,QObjectPrivate继承自QObjectData。

QSaveFile中d_ptr指向的是QSaveFilePrivate

继承关系

QSaveFile>>QFileDevice>>QIODevice>>QObject

QSaveFilePrivate>>QFileDevicePrivate>>QIODevicePrivate>>QObjectPrivate>>QObjectData

数据变量

QSaveFilePrivate单独具有的变量是QString fileName,代表打开文件路径。其他变量都来自父类

QSaveFile细节分层

QSaveFile领域分层

 

主要功能函数

QSaveFile::QSaveFile

作用

构造QSaveFile,d_ptr指向new QSaveFilePrivate并设置QSaveFilePrivate::fileName为当前文件

QSaveFile::fileName

作用

获取QSaveFile指向名称

实现原理

实际上就是QSaveFilePrivate::fileName

QSaveFile::setFileName 

作用

设置QSaveFile指向名称

实现原理

设置QSaveFilePrivate::fileName为当前文件

QSaveFile::cancelWriting

作用

取消写入文件

调用顺序

QSaveFile::cancelWriting>>QFileDevicePrivate::setError

实现原理

设置写入错误,导致QSaveFile::commit中不替换目标文件

QSaveFile::writeData

作用

将数据写入缓存中。如果超过缓存大小(0x4000),则先将缓存刷新到文件中再数据写入到缓存

实现原理

将数据写入QIODevicePrivate::writeBuffer中

QSaveFile::directWriteFallback

作用

获取QSaveFilePrivate::directWriteFallback的值,默认值为false

实现原理

获取QSaveFilePrivate::directWriteFallback变量

QSaveFile::setDirectWriteFallback

作用

当目标文件目录下无法创建新文件时,设置是否直接写入目标文件。相当于是QFile那种写入,断电时数据只写入一部分。默认值为false

实现原理

设置QSaveFilePrivate::directWriteFallback变量

QSaveFile::open

作用

如果当前目标文件目录能够创建新文件,则创建命名为“目标文件名+随机值”的文件。如果目标文件目录不能创建新文件,并且通过QSaveFile::setDirectWriteFallback设置QSaveFilePrivate::directWriteFallback为true,则直接打开目标文件写入数据。

调用顺序

QSaveFilePrivate::directWriteFallback为默认值false时并且目标文件夹目录可创建新文件。

QSaveFile::Open>>QTemporaryFileEngine::open>>QTemporaryFileName::generateNext>>std::generate>>CreateFile>>QFileDevice::open>>QFileInfo::permissions>>GetFileAttributesEx>>QFileDevice::setPermissions>>QFSFileEngine::setPermissions>>QFileSystemEngine::setPermissions>>_wchmod

实现原理

使用std::generate生成随机字符串加在目标文件名称后,比如目标文件名称D:/1.txt,生成随机字符串eFYrqV,则临时文件名为D:/1.txt.eFYrqV。

再用CreateFile创建D:/1.txt.eFYrqV,如果创建失败分2种情况:

  1. D:/1.txt.eFYrqV已经存在则再生成新的临时文件。
  2. 目标文件目录无创建文件权限则回退校验QSaveFilePrivate::directWriteFallback是否为true,如果为true则直接打开目标文件写入。

创建临时文件成功后利用GetFileAttributesEx读取目标文件权限等属性并用_wchmod赋值给新创建的临时文件

QSaveFile::commit

作用

将目标文件替换为临时文件

调用顺序

QSaveFile::commit>>QFileDevice::close>>QFileDevice::flush>>WriteFile>>fflush>>QFSFileEngine::syncToDisk>>QFSFileEnginePrivate::nativeSyncToDisk>>FlushFileBuffers>>QTemporaryFileEngine::renameOverwrite>>QFSFileEngine::renameOverwrite>>QFileSystemEngine::renameOverwriteFile>>MoveFileEx

实现原理

首先利用WriteFileQIODevicePrivate::writeBuffer写到文件中,并利用fflush刷新缓存到磁盘。

最后利用MoveFileEx将目标文件替换为临时文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础篇-设计模式

单例模式&#xff1a; 注意&#xff1a;这里的唯一实例不是使用时候才创建,而是构造时候就会创建; 注意&#xff1a;提前创建了对象&#xff0c;并不是调用时候才创建 解决方法&#xff1a; 枚举饿汉单例&#xff1a; 注意: 饿汉式枚举不会通过反序列化破坏单例 懒汉模式&…

SQL笔记(3)——MySQL数据类型

学习MySQL&#xff0c;通常应该是先学习数据类型的&#xff0c;因为不管是开发还是MySQL中&#xff0c;每个数据对象都有其对应的数据类型&#xff0c;MySQL提供了丰富的数据类型&#xff0c;如在创建表的时候就需要指定列的数据类型&#xff0c;在向表中插入数据时&#xff0c…

ElasticSearch(一)下载及安装(windows)

1. 官网 ElasticSearch官网地址ElasticSearch生态组件下载地址Kibana下载地址ik中文分词插件 备注&#xff1a;网址打不开&#xff0c;或者打开速度慢是正常情况。 2. 解压后目录结构 bin &#xff1a;脚本文件&#xff0c;包括启动elasticsearch&#xff0c;安装插件&#…

目录打开显示提示文件或目录损坏且无法读取、文件或目录损坏且无法读取的破解之道

咱们在平日工作时&#xff0c;通常都会将资料放进不同的目录中&#xff0c;方便咱们找到&#xff0c;随着时间的推移就会产生有越来越多目录。最近有位用户了这样一个问题&#xff0c;就是目录无论怎么都无法打开&#xff0c;这样就无法浏览、使用里面的资料了&#xff0c;影响…

springboot sharding-jdbc 主从 读写分离

目录 1 mysql 主从搭建 1.1 docker mysql 主从搭建 1.2 非docker mysql 主从搭建 2 springboot sharding-jdbc 主从 读写分离 2.1 pom 加依赖 2.1 yml 配置文件 3 测试 -> 直接使用 就是读写分离 3.1 实体类User -> 数据字段 对象字典 3.2 Mapper -> 增删改查…

Nomogram | 盘点一下绘制列线图的几个R包!~(二)

1写在前面 不知道各位小伙伴的五一假期过的在怎么样&#xff0c;可怜的我感冒了。&#x1f637; 今天继续之前没有写完的列线图教程吧&#xff0c;再介绍几个制作列线图的R包。&#x1f920; 2用到的包 rm(list ls())library(tidyverse)library(survival)library(rms)library(…

新闻文本关键词提取有哪些算法,这些算法的特点以及应用,以及不足方面的解决办法

目录 一、新闻文本关键词提取算法 1. TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;算法 2. TextRank算法 3. 词向量算法 4. 深度学习算法 5. 主题模型算法 二、这些算法的不足方面的解决办法 1. TF-IDF算法&#xff1a; 2. TextRank算法&…

一文彻底读懂nginx中的location指令

Nginx主配置文件结构 location 介绍 location是Nginx中的块级指令(block directive),&#xff0c;location指令的功能是用来匹配不同的url请求&#xff0c;进而对请求做不同的处理和响应&#xff0c;这其中较难理解的是多个location的匹配顺序&#xff0c;本文会作为重点来解释…

Effective Modern C++

模板类型推导 template<typename T> void f(T& parms);//reference template<typename T> void f(const T& parms);//const ref template<typename T> void f(T* parms);//pointer template<typename T> void f(T&& parms);//univers…

通讯录的实现(动态完结版)

&#x1f349;博客主页&#xff1a;阿博历练记 &#x1f4d6;文章专栏&#xff1a;c语言&#xff08;初阶与进阶&#xff09; &#x1f357;代码仓库&#xff1a;阿博编程日记 &#x1f339;欢迎关注&#xff1a;欢迎友友们点赞收藏关注哦 文章目录 &#x1f354;前言&#x1f…

java 倒计时实现的方式

倒计时的实现方法有很多种&#xff0c;本文给大家介绍其中一种&#xff0c;最简单的一种实现方式&#xff0c;也是最方便的一种方式&#xff0c;希望能帮到大家。 1、 java中倒计时是利用循环来实现的&#xff0c;我们可以使用循环语句来实现。 2、 java中使用 bool类的 setTim…

python相对路径与绝对路径

9.1 Python 绝对路径与相对路径 - 知乎 (zhihu.com) 目录 1. 绝对路径 1.1 概念 1.2 用绝对路径打开文件 1.2 相对路径 1.3 python路径表示的斜杠问题 1. 绝对路径 1.1 概念 绝对路径 指完整的描述文件位置的路径。绝对路径就是文件或文件夹在硬盘上的完整路径。 在 Win…

Spring--AOP详细介绍--和详细代码演示证明理解

目录 Spring--AOP详细介绍 基本介绍 代码演示—入门 需求说明 定义一个接口类Vehicle 定义一个实现接口类的Car类 定义一个实现接口类的Ship类 创建测试类Test.java 来思考一下&#xff0c; 解决方案-动态代理方式-2 修改 Car类 修改 Ship类 创建VehicleProxyProvid…

AI已经成立社区了,一个个比真人还真

文章目录 nainaimichirper川普的入驻英文版 nainaimi nainaimi是一个13岁的学生&#xff0c;一小时前&#xff0c;被一群人拖到体育馆&#xff0c; 那时的她还很胆小&#xff0c;只能哭诉着那些人的残忍和恶毒 结果半个小时前&#xff0c;她又被拖入了体育馆&#xff0c;这一…

跟着我学 AI丨让计算机看懂世界

计算机视觉是一种利用计算机和数学算法来处理、分析和识别数字影像的技术。这项技术在近年来得到了快速发展&#xff0c;应用范围也越来越广泛&#xff0c;它已经成为了人工智能领域中的重要分支之一。 技术原理 计算机视觉技术主要涉及图像处理、模式识别和机器学习等方面的技…

自然语言处理与其Mix-up数据增强方法报告

自然语言处理与其Mix-up数据增强方法 1绪论1.课题背景与意义1.2国内外研究现状 2 自然语言经典知识简介2.1 贝叶斯算法2.2 最大熵模型2.3神经网络模型 3 Data Augmentation for Neural Machine Translation with Mix-up3.1 数据增强3.2 对于神经机器翻译的软上下文的数据增强3.…

微信小程序学习实录2(下拉刷新、下拉加载更多、小程序事件、PHP后端代码、刷新无数据解决方案)

微信小程序学习实录2 一、全局配置1.启用lazyCodeLoading2.启用enablePullDownRefresh 二、设置全局变量三、页面初始化数据四、当前页面进入执行下拉刷新五、监听用户下拉动作六、页面上拉触底事件的处理函数七、PHP后端对接API八、常见问题1.不显示下拉加载...2.下拉不刷新数…

【Fluent】导出瞬态计算过程每一秒或每一个时间步的各个坐标/节点的物理量-温度场-压力场

一、功能需求 如果你进行的是稳态计算&#xff0c;你需要将物理场中的每一个节点上的物理量数据&#xff08;例如温度、压力&#xff09;导出成类似txt或Excel表格的文件。 文件里的内容形式是&#xff1a;每一行中有节点ID、节点的XYZ坐标、物理量&#xff08;温度压力等&am…

【MySQL】外连接查询

如果我们使用内连接来查询数据&#xff1a; 使用inner join - on子句&#xff1a;显示的是所有匹配的信息 select * from emp e inner join dept d on e.deptno d.deptno;inner join - on子句缺点&#xff1a; 部门编号为40的&#xff0c;没有显示员工信息&#xff0c;将不…

【代码随想录】刷题Day14

递归实现的一些理解 1.如果是链表的遍历其实不需要怎么思考&#xff1b;无非就是先定参数然后考虑是先操作后遍历还是先走到底再操作。 包括我之前在写链表的节点删除其实核心思路就是由于链表前面删除后面找不到的原理&#xff0c;以至于我们需要走到链表的底部再进行操作。 2…