Qt开发之文件系统
一、文件操作相关类概述
继承关系如图

一、文件操作相关类概述
1.输入输出设备类
如上如,QIODevice子类除了QFileDevice以外还有QAbstractSocket(下有QTcpSocket,QUdpSocket),QSerialPort,QBuletoothSocket,QProcess,QBuffer。
2.文件读写操作类
文件读写主要涉及:
- 打开文件:使用open函数以不同模式打开文件
- 读数据:QFile提供多种读写数据接口,如readAll(),read()
- 写数据:如write(),writeData()
- 关闭文件:close()
其实QFile就可以实现文本文件或者二进制文件的读写,但只有一些基本的读写函数,不够方便。
QtextStream能够以流的方式读写文本文件
QDataStream能够以流的方式读写二进制文件。这两个类需要与QFile一起使用。
这两个类都继承于QIODeviceBase,他们的兄弟还有QDebug,用来将调试信息输出到某种设备,可以输出到文件、字符串、或者console窗口。
3.特定格式文件的读写
XML文件:
XML是用于标记结构化数据的一种标记语言,基于xml的文件与平台无关。Qt的XML模块提供了两种读写XML的方法,如下:
基于DOM:其API将XML文档用树状结构表示,整个XML文档用一个
QDomDocument对象表示,文档树状结构中的节点都用QDomNode及其子类表示。该方法在解析XML文档后,在内存中保留了文档的对象模型,因而便于操作文档内容;基于流:使用
QXmlStreamReader和QXmlStreamWriter类进行读写,读取时就是将XML文件解析为一系列的标记token。JSON文件:
JSON可以将JS对象中表示的一组数据转换为字符串,然后在网络或者程序间轻松传递该字符串,并在需要时还原为各种所需的数据格式。
QJsonDocument用于读写JSON文件,QJsonArray是封装了JSON数组的类,QJsonObject是封装了JSON对象的类,QJsonValue是封装了JSON值的类。
图片文件:
使用QImage和QPixmap直接读取文件,读取时总是按照图片原始大小读取整张图片
QImageReader:用于读取图片文件时实现更多控制,如setscalesize指定大小实现缩略图
QImageWriter:用于保存图片时提供更多选择,如压缩级别与图片品质。
二、目录和文件操作
除了文件读写,qt还提供了一些类用于目录和文件操作,如获取当前目录,新建目录,复制文件,分离文件的路径和基本文件名,判断文件是否存在
示例程序
下面用一个程序来演示各种目录与文件操作类的主要功能,界面设计如下,左边是toolbox,每个页面里面都是若干按钮,右边是显示区。showBtnInfo()在每个按钮被按下后触发,主要是显示按钮的text,并且将所测试函数的qt帮助文档里面的基本描述文字作为该按钮的toolTip文字。

1.QCoreApplication
可以提取应用程序的路径、程序名等信息
主要几个静态函数有
| 函数原型 | 功能说明 | 典型使用场景(工控上位机) |
|---|---|---|
| 路径类核心函数 | ||
static QString QCoreApplication::applicationDirPath() |
返回应用程序可执行文件所在目录的绝对路径(不含可执行文件名)例:Windows → C:/Project/bin,Linux → /opt/app/ |
加载本地配置文件(如 appDirPath() + "/config.ini")、读取本地资源(图标 / 协议配置) |
static QString QCoreApplication::applicationFilePath() |
返回应用程序可执行文件的完整绝对路径(含可执行文件名)例:Windows → C:/Project/bin/PrimeCounter.exe |
获取可执行文件的完整路径(如校验程序完整性、记录运行路径日志) |
static QString QCoreApplication::applicationName() |
返回应用程序名称(默认是可执行文件名,可通过 setApplicationName 设置) |
窗口标题拼接(如 appName() + " - 工控数据采集系统")、日志前缀 |
static void QCoreApplication::setApplicationName(const QString &name) |
设置应用程序名称(覆盖默认的可执行文件名) | 统一应用标识(如设置为 “温度控制器上位机”,而非 PrimeCounter.exe) |
static QString QCoreApplication::arguments() |
返回命令行参数列表(第一个元素是应用程序路径,后续是传入的参数) | 解析启动参数(如 ./app -config /etc/config.ini)、批量导入配置 |
static QString QCoreApplication::workingDirectory() |
返回应用程序当前工作目录(默认是启动程序时的目录,可通过 QDir::setCurrent 修改) |
读写相对路径文件(如日志文件 workingDirectory() + "/log.txt") |
| 元信息类核心函数 | ||
static QString QCoreApplication::organizationName() |
返回应用程序所属组织名称(需通过 setOrganizationName 设置) |
配置文件路径拼接(Qt 自动将配置存到 ~/.config/组织名/应用名) |
static void QCoreApplication::setOrganizationName(const QString &org) |
设置组织名称(如 “XX 工业自动化有限公司”) | 区分不同组织的应用配置,避免配置文件冲突 |
static QString QCoreApplication::version() |
返回应用程序版本号(需通过 setApplicationVersion 设置) |
关于窗口显示版本(如 V1.0.2)、版本校验 |
static void QCoreApplication::setApplicationVersion(const QString &version) |
设置应用程序版本号 |

2.QFile
可进行文件的复制、删除、重命名等操作
下述参数均是打开文件之前,对任意文件的操作
除此之外也有对当前文件的操作函数,如size()等
| 函数原型 | 功能说明 |
|---|---|
static bool QFile::exists(const QString &fileName) |
检查指定路径的文件 / 目录是否存在(路径可传文件或目录,返回 bool) |
static bool QFile::remove(const QString &fileName) |
删除指定文件,成功返回 true;若文件正在被使用 / 权限不足返回 false(不能删目录) |
static bool QFile::moveToTrash(const QString &fileName,QString *pathInTrash =nullptr) |
将一个文件移除到回收站 |
static bool QFile::rename(const QString &oldName, const QString &newName) |
重命名文件(或移动文件),跨盘符 / 文件系统移动可能失败,返回操作结果 |
static bool QFile::copy(const QString &fileName, const QString &newName) |
复制文件,目标路径若已存在同名文件则复制失败,返回操作结果 |
static QString QFile::decodeName(const QByteArray &localFileName) |
将本地编码的文件名(如 GBK)解码为 Qt 统一的 UTF-16 字符串 |
static QByteArray QFile::encodeName(const QString &fileName) |
将 Qt 字符串文件名编码为本地系统编码的字节数组(适配不同系统路径格式) |
static bool QFile::link(const QString &fileName,QString &linkName) |
创建文件链接,在Windows上就是创建快捷方式 |
static bool QFile::setPermissions(const QString &fileName,QFileDevice::Permissions permissions) |
设置一个文件的权限,权限是枚举类型 |

3.QFileInfo
用于获取文件的各种信息,如文件路径、基本文件名、文件名后缀、文件大小等。
同QFile一样,创建一个实例对象可以指定一个文件名作为当前文件,也可以用函数setFile指定一个文件作为当前文件。
下面是一些常用接口函数
| void serFile(QString &file) | 设置一个文件名,使改文件作为QFileInfo对象操作的当前文件 |
|---|---|
| QString absoluteFilePath() | 返回包含文件名的绝对路径 |
| QString absolutePath() | 返回绝对路径,不包含文件名 |
| QDir absoluteDIR() | 返回绝对路径,返回值为QDir |
| QString fileName() | 返回去除路径的文件名 |
| QString filePath() | 返回包含路径的文件名 |
| QString path() | 返回不含文件名的路径 |
| qint64 size() | 返回文件大小,单位字节 |
| QString baseName | 返回文件基名,第一个.之前的文件名 |
| QString completeBaseName | 返回最后一个.之前的文件名 |
| QS suffix() | 返回最后一个.之后的后缀 |
| QS completeSuffix() | 返回第一个.之后的后缀 |
| bool isDir() | 判断当前对象是不是一个目录或者其快捷方式 |
| bool isFile | 判断当前对象是不是一个文件,或其快捷方式 |
| bool isExecutable | 判断当前文件是不是可执行文件 |
| QDAte fileTIme(QFile::FileTime time) | 返回文件的时间,根据参数返回不同时间 |
| QDateTime birthTime,lastModified,lastRead,metadataChangeTime | 返回创建,最后修改,最后读取,元数据最后被修改的时间 |
| void refresh() | 刷新文件 |
| exists |

4.QDir
用于目录信息获取和目录操作,如新建目录、删除目录、获取目录下的文件或子目录等。
同前两个一样,构造传参或者setPath设置当前目录。
绝对路径以/或者盘符开始
相对路径以目录名称开始
操作qt资源文件以 :/作为目录起始符
5.QTemporaryDir
用于创建临时目录,临时目录可以在使用后自动删除
6.QTemporaryFile
用于创建临时文件,可以在使用后自动删除
7.QFileSystemWatcher
QFileSystemWatcher 核心作用
QFileSystemWatcher 是 Qt 提供的文件/目录监控类,能实时监听指定文件/目录的变化(如创建、删除、修改、重命名),并通过信号通知程序——无需轮询,效率高,适合工控上位机中“监控配置文件修改、日志文件新增、设备数据文件变化”等场景。
核心特性
- 监控对象:支持单个文件、多个文件、单个目录、多个目录;
- 触发信号:文件/目录变化时自动发信号,程序只需响应信号即可;
- 跨平台:兼容 Windows/Linux/macOS,底层调用系统原生监控接口(如 Windows 的 ReadDirectoryChangesW、Linux 的 inotify);
- 局限性:
- 监控目录时,仅能感知“目录内文件/子目录的增删改”,无法感知子目录下的深层变化(需手动监控子目录);
- 文件被重命名/删除后,会自动从监控列表移除,需重新添加。
核心接口
| 函数/信号 | 功能 |
|---|---|
addPath(const QString &path) |
添加要监控的文件/目录路径,成功返回 true |
addPaths(const QStringList &paths) |
批量添加监控路径 |
removePath(const QString &path) |
移除监控路径 |
fileChanged(const QString &path) |
信号:监控的文件被修改/重命名/删除时触发,参数为变化的文件路径 |
directoryChanged(const QString &path) |
信号:监控的目录内有文件/子目录增删改时触发,参数为变化的目录路径 |
基础用法(工控场景示例)
以“监控上位机配置文件(config.ini)修改”为例:
1 |
|
工控场景常见用法
- 配置文件热更新:监控
config.ini,修改后无需重启程序,自动加载新配置; - 日志文件监控:监控日志目录,新生成日志文件时自动读取/上传;
- 设备数据文件监控:监控PLC导出的CSV数据文件,文件生成后自动解析;
- U盘插拔感知:监控U盘挂载目录(如 Windows 的
D:/),感知U盘插入后自动读取数据。
要点
- 对象生命周期:
QFileSystemWatcher需创建为堆对象(new),若为栈对象(如局部变量),析构后会停止监控; - 文件重命名/删除:文件被重命名/删除后,会从监控列表移除,需在
fileChanged中重新添加(若需要继续监控); - 深层目录监控:监控目录仅能感知一级变化,若需监控
logs/2025/12这类深层目录,需手动添加该子目录到监控列表; - 性能控制:避免监控大量文件/目录(如上千个),会占用系统资源,建议按需监控。
总结
QFileSystemWatcher 是 Qt 实现“文件/目录实时监控”的核心类,用法极简:创建对象→添加监控路径→连接变化信号→处理业务逻辑。在工控上位机中,尤其适合“无需轮询、实时响应文件变化”的场景,是提升程序交互性的关键工具。
三、读写文本文件
1.用QFile读写文本文件
- 写文本文件(覆盖原有内容)
1 | // 1. 初始化文件对象 |
- 追加内容到文本文件
1 | QFile file("test.txt"); |
- 按行读取文本文件
1 | QFile file("test.txt"); |
- 一次性读取全部文本
1 | QFile file("test.txt"); |
核心要点
- 打开模式:
WriteOnly(写)、ReadOnly(读)、**Append**(追加)、**Truncate**(清空)、Text(文本模式,跨平台处理\n); QTextStream:简化文本读写,自动处理编码(默认UTF-8)和数据类型转换;- 错误处理:通过
errorString()获取具体失败原因(如权限不足、文件不存在)。
2.用QSaveFile保存文件
QSaveFile 是 Qt 专为安全写文件设计的类(解决普通 QFile 写文件时崩溃导致文件损坏的问题),核心逻辑:先写入临时文件,成功后原子替换目标文件,失败则保留原文件。
1. 基础保存(覆盖原有文件)
1 | // 1. 初始化QSaveFile对象(指定目标文件路径) |
2. 取消保存(放弃写入)
1 | QSaveFile saveFile("device_config.txt"); |
3. 追加内容(先读原文件,再追加,最后原子替换)
1 | QSaveFile saveFile("device_log.txt"); |
核心优势(对比 QFile)
| 特性 | QFile | QSaveFile |
|---|---|---|
| 写失败影响 | 原文件可能被清空/损坏 | 原文件完全保留,仅失败临时文件 |
| 原子操作 | 无(直接写目标文件) | 有(先写临时文件,成功再替换) |
| 崩溃容错 | 差(崩溃会导致文件损坏) | 好(崩溃不影响原文件) |
| 用法 | 简单 | 和QFile兼容,仅多一步commit |
关键要点
- 必须调用
commit()才会替换目标文件,未调用则临时文件自动删除; cancelWriting()可主动放弃保存,适合写入过程中检测到错误的场景;- 工控场景优先用
QSaveFile保存配置文件、设备参数等关键数据,避免写文件中断导致数据丢失。
3.结合使用QFile+QTextStream读写文本文件
四、读写二进制文件
二进制文件(如图片、PDF、SEGY、自定义设备固件等)无统一字符编码,以字节为单位存储数据。Qt 中可通过 QFile 单独读写,更推荐 QFile + QDataStream 组合(提供标准化数据序列化/反序列化能力),以下是完整知识文档:
1. 基础认知与工具软件
1.1 二进制文件核心特征
- 无固定字符编码,数据按“字节流”存储(如图片的像素值、SEGY的地震数据、PDF的字节码);
- 读写需严格遵循数据格式约定(如固定字节序、数据类型长度),否则解析错误;
- 相比文本文件,二进制文件体积更小、读写效率更高,适合存储非字符型数据。
1.2 常用辅助工具
- 二进制编辑器:WinHex(Windows)、010 Editor(跨平台)、Hex Fiend(Mac)——用于查看/验证二进制文件的字节内容;
- Qt 调试工具:
qDebug()打印字节数组、QDataStream的状态校验(如status()检查读写是否正常)。
2. QDataStream 核心基础
QDataStream 是 Qt 专为二进制数据序列化设计的类,可与 QFile 配合,实现“基本数据类型(int/float等)→ 字节流”的双向转换,核心优势:
- 跨平台兼容(自动处理字节序/数据长度);
- 支持 Qt 自定义类型(如
QString、QByteArray、QList); - 可设置版本号,保证不同 Qt 版本读写兼容性。
2.1 核心配置
1 | // 1. 绑定QFile对象 |
2.2 核心状态校验
1 | // 检查读写过程是否出错(如文件截断、数据格式不匹配) |
3. 使用预定义编码方式读写文件
预定义编码方式指利用 QDataStream 内置的序列化规则,读写「基本数据类型」「Qt 内置类型」,无需手动处理字节转换,是最常用的二进制读写方式。
3.1 写入预定义类型
1 | QFile file("device_data.bin"); |
3.2 读取预定义类型
1 | QFile file("device_data.bin"); |
4. 使用原始二进制数据方式读写文件
原始二进制读写指直接操作字节数组(QByteArray),不依赖 QDataStream 的序列化规则,适合读写「无固定格式」「第三方定义格式」的二进制文件(如SEGY、自定义固件)。
4.1 写入原始二进制数据
1 | QFile file("raw_data.bin"); |
4.2 读取原始二进制数据
方式1:一次性读取全部字节
1 | QFile file("raw_data.bin"); |
方式2:按指定长度读取(适合大文件)
1 | QFile file("large_data.bin"); |
4.3 关键注意事项
- 原始读写需手动处理字节序(如小端/大端转换),推荐用
qFromLittleEndian<qint32>()等工具函数:
1 | // 从字节数组解析小端序32位整数 |
- 读取固定长度时,需检查实际读取字节数(避免文件截断导致解析错误);
- 大文件推荐分块读取,避免占用过多内存。
| 读写方式 | 适用场景 | 优势 | 注意事项 |
|---|---|---|---|
| QFile + QDataStream | 自定义二进制格式、Qt类型序列化 | 跨平台、易维护、兼容Qt类型 | 必须保证读写版本/字节序/类型一致 |
| 纯QFile(原始字节) | 第三方二进制格式(SEGY/PDF)、大文件 | 灵活、无序列化开销 | 需手动处理字节序、数据解析 |
工控场景建议:
- 设备参数/自定义协议 → 用
QDataStream(易维护); - 第三方格式(SEGY/固件)→ 用原始字节读写(精准匹配格式)。



