一、文件操作相关类概述

继承关系如图

img

一、文件操作相关类概述

1.输入输出设备类

如上如,QIODevice子类除了QFileDevice以外还有QAbstractSocket(下有QTcpSocketQUdpSocket),QSerialPortQBuletoothSocketQProcessQBuffer

2.文件读写操作类

文件读写主要涉及:

  1. 打开文件:使用open函数以不同模式打开文件
  2. 读数据:QFile提供多种读写数据接口,如readAll(),read()
  3. 写数据:如write(),writeData()
  4. 关闭文件:close()

其实QFile就可以实现文本文件或者二进制文件的读写,但只有一些基本的读写函数,不够方便。

QtextStream能够以流的方式读写文本文件

QDataStream能够以流的方式读写二进制文件。这两个类需要与QFile一起使用

这两个类都继承于QIODeviceBase,他们的兄弟还有QDebug,用来将调试信息输出到某种设备,可以输出到文件、字符串、或者console窗口。

3.特定格式文件的读写

  1. XML文件

  2. XML是用于标记结构化数据的一种标记语言,基于xml的文件与平台无关。Qt的XML模块提供了两种读写XML的方法,如下:

  3. 基于DOM:其API将XML文档用树状结构表示,整个XML文档用一个QDomDocument对象表示,文档树状结构中的节点都用QDomNode及其子类表示。该方法在解析XML文档后,在内存中保留了文档的对象模型,因而便于操作文档内容;

  4. 基于流:使用QXmlStreamReaderQXmlStreamWriter类进行读写,读取时就是将XML文件解析为一系列的标记token。

  5. JSON文件

  6. JSON可以将JS对象中表示的一组数据转换为字符串,然后在网络或者程序间轻松传递该字符串,并在需要时还原为各种所需的数据格式。

  7. QJsonDocument用于读写JSON文件,QJsonArray是封装了JSON数组的类,QJsonObject是封装了JSON对象的类,QJsonValue是封装了JSON值的类。

  8. 图片文件

  9. 使用QImage和QPixmap直接读取文件,读取时总是按照图片原始大小读取整张图片

  10. QImageReader:用于读取图片文件时实现更多控制,如setscalesize指定大小实现缩略图

  11. QImageWriter:用于保存图片时提供更多选择,如压缩级别与图片品质。

二、目录和文件操作

除了文件读写,qt还提供了一些类用于目录和文件操作,如获取当前目录,新建目录,复制文件,分离文件的路径和基本文件名,判断文件是否存在

示例程序

下面用一个程序来演示各种目录与文件操作类的主要功能,界面设计如下,左边是toolbox,每个页面里面都是若干按钮,右边是显示区。showBtnInfo()在每个按钮被按下后触发,主要是显示按钮的text,并且将所测试函数的qt帮助文档里面的基本描述文字作为该按钮的toolTip文字。

img

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) 设置应用程序版本号

img

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) 设置一个文件的权限,权限是枚举类型

img

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

img

4.QDir

用于目录信息获取和目录操作,如新建目录、删除目录、获取目录下的文件或子目录等。

同前两个一样,构造传参或者setPath设置当前目录。

绝对路径以/或者盘符开始

相对路径以目录名称开始

操作qt资源文件以 :/作为目录起始符

5.QTemporaryDir

用于创建临时目录,临时目录可以在使用后自动删除

6.QTemporaryFile

用于创建临时文件,可以在使用后自动删除

7.QFileSystemWatcher

QFileSystemWatcher 核心作用

QFileSystemWatcher 是 Qt 提供的文件/目录监控类,能实时监听指定文件/目录的变化(如创建、删除、修改、重命名),并通过信号通知程序——无需轮询,效率高,适合工控上位机中“监控配置文件修改、日志文件新增、设备数据文件变化”等场景。

核心特性
  1. 监控对象:支持单个文件、多个文件、单个目录、多个目录;
  2. 触发信号:文件/目录变化时自动发信号,程序只需响应信号即可;
  3. 跨平台:兼容 Windows/Linux/macOS,底层调用系统原生监控接口(如 Windows 的 ReadDirectoryChangesW、Linux 的 inotify);
  4. 局限性
  • 监控目录时,仅能感知“目录内文件/子目录的增删改”,无法感知子目录下的深层变化(需手动监控子目录);
  • 文件被重命名/删除后,会自动从监控列表移除,需重新添加。
核心接口
函数/信号 功能
addPath(const QString &path) 添加要监控的文件/目录路径,成功返回 true
addPaths(const QStringList &paths) 批量添加监控路径
removePath(const QString &path) 移除监控路径
fileChanged(const QString &path) 信号:监控的文件被修改/重命名/删除时触发,参数为变化的文件路径
directoryChanged(const QString &path) 信号:监控的目录内有文件/子目录增删改时触发,参数为变化的目录路径
基础用法(工控场景示例)

以“监控上位机配置文件(config.ini)修改”为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <QFileSystemWatcher>
#include <QDebug>
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

// 1. 创建监控对象(需为堆对象,避免栈对象提前析构)
QFileSystemWatcher *watcher = new QFileSystemWatcher;

// 2. 添加要监控的文件路径(工控常用:应用目录下的配置文件)
QString configPath = QCoreApplication::applicationDirPath() + "/config.ini";
watcher->addPath(configPath);

// 3. 连接文件变化信号(核心:响应配置文件修改)
QObject::connect(watcher, &QFileSystemWatcher::fileChanged,
[=](const QString &path) {
qDebug() << "配置文件已修改:" << path;
// 业务逻辑:重新加载配置文件
reloadConfig(path);
});

// 4. (可选)监控目录(如日志目录,感知新日志文件生成)
QString logDir = QCoreApplication::applicationDirPath() + "/logs";
watcher->addPath(logDir);
QObject::connect(watcher, &QFileSystemWatcher::directoryChanged,
[=](const QString &path) {
qDebug() << "日志目录变化:" << path;
// 业务逻辑:扫描新增的日志文件
scanNewLogFiles(path);
});

return a.exec();
}

// 示例:重新加载配置文件
void reloadConfig(const QString &path) {
QSettings settings(path, QSettings::IniFormat);
// 读取最新配置(如Modbus端口、设备地址)
int port = settings.value("Modbus/Port", 502).toInt();
qDebug() << "重新加载配置:Modbus端口=" << port;
}
工控场景常见用法
  1. 配置文件热更新:监控 config.ini,修改后无需重启程序,自动加载新配置;
  2. 日志文件监控:监控日志目录,新生成日志文件时自动读取/上传;
  3. 设备数据文件监控:监控PLC导出的CSV数据文件,文件生成后自动解析;
  4. U盘插拔感知:监控U盘挂载目录(如 Windows 的 D:/),感知U盘插入后自动读取数据。
要点
  1. 对象生命周期QFileSystemWatcher 需创建为堆对象(new),若为栈对象(如局部变量),析构后会停止监控;
  2. 文件重命名/删除:文件被重命名/删除后,会从监控列表移除,需在 fileChanged 中重新添加(若需要继续监控);
  3. 深层目录监控:监控目录仅能感知一级变化,若需监控 logs/2025/12 这类深层目录,需手动添加该子目录到监控列表;
  4. 性能控制:避免监控大量文件/目录(如上千个),会占用系统资源,建议按需监控。
总结

QFileSystemWatcher 是 Qt 实现“文件/目录实时监控”的核心类,用法极简:创建对象→添加监控路径→连接变化信号→处理业务逻辑。在工控上位机中,尤其适合“无需轮询、实时响应文件变化”的场景,是提升程序交互性的关键工具。

三、读写文本文件

1.用QFile读写文本文件

  1. 写文本文件(覆盖原有内容)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1. 初始化文件对象
QFile file("test.txt");
// 2. 打开文件:只写 + 清空原有内容 + 文本模式(自动处理换行符)
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
// 3. 构建文本流
QTextStream out(&file);
// 4. 写入内容(支持字符串、数字、换行符)
out << "工控设备参数\n";
out << "温度阈值:" << 80 << "\n";
out << "压力阈值:1.2\n";
// 5. 关闭文件(可选,析构时自动关闭)
file.close();
} else {
qDebug() << "写文件失败:" << file.errorString();
}
  1. 追加内容到文本文件
1
2
3
4
5
6
7
8
9
QFile file("test.txt");
// 打开模式:只写 + 追加(不清空原有内容) + 文本模式
if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
QTextStream out(&file);
out << "新增参数:Modbus端口=502\n"; // 追加到文件末尾
file.close();
} else {
qDebug() << "追加失败:" << file.errorString();
}
  1. 按行读取文本文件
1
2
3
4
5
6
7
8
9
10
11
12
13
QFile file("test.txt");
// 打开模式:只读 + 文本模式
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
// 逐行读取,直到文件末尾
while (!in.atEnd()) {
QString line = in.readLine(); // 读取一行(自动剔除换行符)
qDebug() << "读取到:" << line;
}
file.close();
} else {
qDebug() << "读文件失败:" << file.errorString();
}
  1. 一次性读取全部文本
1
2
3
4
5
6
7
QFile file("test.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
// 一次性读取所有内容(适合小文件)
QString allContent = file.readAll();
qDebug() << "全部内容:\n" << allContent;
file.close();
}

核心要点

  • 打开模式:WriteOnly(写)、ReadOnly(读)、**Append**(追加)、**Truncate**(清空)、Text(文本模式,跨平台处理 \n);
  • QTextStream:简化文本读写,自动处理编码(默认UTF-8)和数据类型转换;
  • 错误处理:通过 errorString() 获取具体失败原因(如权限不足、文件不存在)。

2.用QSaveFile保存文件

QSaveFile 是 Qt 专为安全写文件设计的类(解决普通 QFile 写文件时崩溃导致文件损坏的问题),核心逻辑:先写入临时文件,成功后原子替换目标文件,失败则保留原文件。

1. 基础保存(覆盖原有文件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 1. 初始化QSaveFile对象(指定目标文件路径)
QSaveFile saveFile("device_config.txt");

// 2. 打开临时文件(只写 + 文本模式)
if (saveFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
// 3. 写入内容(用法和QTextStream完全兼容)
QTextStream out(&saveFile);
out << "温度阈值:85\n";
out << "Modbus地址:2\n";
out << "采样频率:100ms\n";

// 4. 关键:提交保存(原子替换目标文件)
if (saveFile.commit()) {
qDebug() << "文件保存成功";
} else {
qDebug() << "提交失败:" << saveFile.errorString();
}
} else {
qDebug() << "打开临时文件失败:" << saveFile.errorString();
}
2. 取消保存(放弃写入)
1
2
3
4
5
6
7
8
9
QSaveFile saveFile("device_config.txt");
if (saveFile.open(QIODevice::WriteOnly)) {
QTextStream out(&saveFile);
out << "错误的配置内容...";

// 检测到内容错误,取消保存(临时文件会被自动删除,原文件保留)
saveFile.cancelWriting();
qDebug() << "已取消保存,原文件未被修改";
}
3. 追加内容(先读原文件,再追加,最后原子替换)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
QSaveFile saveFile("device_log.txt");
if (saveFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
// 步骤1:先读取原文件内容(保留原有数据)
QFile originalFile("device_log.txt");
if (originalFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
saveFile.write(originalFile.readAll()); // 写入原文件内容
originalFile.close();
}

// 步骤2:追加新内容
QTextStream out(&saveFile);
out << "2025-12-16 10:00: 设备运行正常\n";

// 步骤3:提交保存
saveFile.commit();
}

核心优势(对比 QFile)

特性 QFile QSaveFile
写失败影响 原文件可能被清空/损坏 原文件完全保留,仅失败临时文件
原子操作 无(直接写目标文件) 有(先写临时文件,成功再替换)
崩溃容错 差(崩溃会导致文件损坏) 好(崩溃不影响原文件)
用法 简单 和QFile兼容,仅多一步commit

关键要点

  1. 必须调用 commit() 才会替换目标文件,未调用则临时文件自动删除;
  2. cancelWriting() 可主动放弃保存,适合写入过程中检测到错误的场景;
  3. 工控场景优先用 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 自定义类型(如 QStringQByteArrayQList);
  • 可设置版本号,保证不同 Qt 版本读写兼容性。
2.1 核心配置
1
2
3
4
5
6
7
8
9
10
11
// 1. 绑定QFile对象
QFile file("data.bin");
file.open(QIODevice::ReadWrite);
QDataStream stream(&file);

// 2. 设置版本号(关键:保证跨版本兼容,建议固定)
stream.setVersion(QDataStream::Qt_6_5); // 匹配开发环境Qt版本

// 3. 设置字节序(默认大端,可手动指定)
stream.setByteOrder(QDataStream::LittleEndian); // 小端(适配工控设备/Windows)
// stream.setByteOrder(QDataStream::BigEndian); // 大端(默认,适配网络/UNIX)
2.2 核心状态校验
1
2
3
4
// 检查读写过程是否出错(如文件截断、数据格式不匹配)
if (stream.status() != QDataStream::Ok) {
qDebug() << "二进制读写错误:" << stream.status();
}

3. 使用预定义编码方式读写文件

预定义编码方式指利用 QDataStream 内置的序列化规则,读写「基本数据类型」「Qt 内置类型」,无需手动处理字节转换,是最常用的二进制读写方式。

3.1 写入预定义类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
QFile file("device_data.bin");
if (file.open(QIODevice::WriteOnly)) {
QDataStream out(&file);
out.setVersion(QDataStream::Qt_6_5); // 固定版本

// 写入基本数据类型
out << qint32(100); // 4字节整数(设备ID)
out << qreal(25.6); // 8字节浮点数(温度值)
out << quint8(0x01); // 1字节无符号数(状态位)

// 写入Qt内置类型
out << QString("设备A"); // 序列化QString(含长度+UTF-16编码)
out << QByteArray("raw_data"); // 字节数组(含长度+原始字节)
out << QList<qint16>{1,2,3}; // 列表(含元素个数+每个元素)

file.close();
}
3.2 读取预定义类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
QFile file("device_data.bin");
if (file.open(QIODevice::ReadOnly)) {
QDataStream in(&file);
in.setVersion(QDataStream::Qt_6_5); // 必须与写入时版本一致

// 按写入顺序读取(类型、顺序必须严格匹配)
qint32 deviceId;
qreal temp;
quint8 status;
QString devName;
QByteArray rawData;
QList<qint16> list;

in >> deviceId >> temp >> status >> devName >> rawData >> list;

// 校验读取结果
if (in.status() == QDataStream::Ok) {
qDebug() << "设备ID:" << deviceId;
qDebug() << "温度:" << temp;
qDebug() << "设备名:" << devName;
}
file.close();
}

4. 使用原始二进制数据方式读写文件

原始二进制读写指直接操作字节数组(QByteArray),不依赖 QDataStream 的序列化规则,适合读写「无固定格式」「第三方定义格式」的二进制文件(如SEGY、自定义固件)。

4.1 写入原始二进制数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QFile file("raw_data.bin");
if (file.open(QIODevice::WriteOnly)) {
// 1. 构造原始字节数组(手动拼接字节)
QByteArray data;
data.append(0x00); // 第1字节:标识位
data.append((char)0xFF); // 第2字节:状态位
data.append(reinterpret_cast<const char*>(&(qint32(1234))), 4); // 4字节整数

// 2. 直接写入字节数组
qint64 written = file.write(data);
if (written != data.size()) {
qDebug() << "写入不完整,仅写入" << written << "字节";
}
file.close();
}
4.2 读取原始二进制数据

方式1:一次性读取全部字节

1
2
3
4
5
6
7
8
9
10
11
12
13
QFile file("raw_data.bin");
if (file.open(QIODevice::ReadOnly)) {
// 读取全部字节(适合小文件)
QByteArray allData = file.readAll();
// 解析字节(按自定义规则)
char flag = allData.at(0); // 第1字节
char status = allData.at(1); // 第2字节
qint32 num = *reinterpret_cast<const qint32*>(allData.mid(2, 4).data()); // 2-5字节

qDebug() << "标识位:" << (int)flag;
qDebug() << "数值:" << num;
file.close();
}

方式2:按指定长度读取(适合大文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QFile file("large_data.bin");
if (file.open(QIODevice::ReadOnly)) {
char buffer[1024]; // 定义缓冲区(1KB)
qint64 bytesRead;
// 循环读取,每次读1024字节
while ((bytesRead = file.read(buffer, sizeof(buffer))) > 0) {
// 处理当前缓冲区的字节(如解析SEGY数据块)
processRawBytes(buffer, bytesRead);
}
file.close();
}

// 自定义字节处理函数
void processRawBytes(const char* buffer, qint64 len) {
for (qint64 i=0; i<len; i++) {
qDebug() << "第" << i << "字节:" << (unsigned char)buffer[i];
}
}
4.3 关键注意事项
  • 原始读写需手动处理字节序(如小端/大端转换),推荐用 qFromLittleEndian<qint32>() 等工具函数:
1
2
// 从字节数组解析小端序32位整数
qint32 num = qFromLittleEndian<qint32>(allData.mid(2, 4).constData());
  • 读取固定长度时,需检查实际读取字节数(避免文件截断导致解析错误);
  • 大文件推荐分块读取,避免占用过多内存。
读写方式 适用场景 优势 注意事项
QFile + QDataStream 自定义二进制格式、Qt类型序列化 跨平台、易维护、兼容Qt类型 必须保证读写版本/字节序/类型一致
纯QFile(原始字节) 第三方二进制格式(SEGY/PDF)、大文件 灵活、无序列化开销 需手动处理字节序、数据解析

工控场景建议:

  • 设备参数/自定义协议 → 用 QDataStream(易维护);
  • 第三方格式(SEGY/固件)→ 用原始字节读写(精准匹配格式)。