
🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

文章目录
- 前言:
- [一. Qt 文件操作核心类概述](#一. Qt 文件操作核心类概述)
- [二. QFile 核心:文件读写实战](#二. QFile 核心:文件读写实战)
-
- [2.1 关键前提:文件打开模式](#2.1 关键前提:文件打开模式)
- [2.2 实战示例1:文本文件读写(简易记事本)](#2.2 实战示例1:文本文件读写(简易记事本))
- [2.3 实战示例2:二进制文件读写(适用于图片 / 视频 / 二进制数据)](#2.3 实战示例2:二进制文件读写(适用于图片 / 视频 / 二进制数据))
- [三. QFileInfo 核心:文件属性获取](#三. QFileInfo 核心:文件属性获取)
- [四. 避坑指南(新手必看)](#四. 避坑指南(新手必看))
- 结尾:
前言:
文件操作是 Qt 应用程序的核心功能之一,无论是配置文件读写、日志存储还是数据导入导出,都离不开可靠的文件处理机制。Qt 提供了
QFile类实现跨平台的文件读写,搭配QFileInfo类可轻松获取文件属性(大小、创建时间、后缀名等),无需关注底层系统差异(Windows/Linux/macOS),极大简化了开发流程。本文基于 PPT 中QFile相关内容,从文件读写、打开模式、文件信息获取三个核心维度,结合可直接运行的实战代码,帮你彻底掌握 Qt 文件操作的核心技巧,解决日常开发中 90% 以上的文件处理场景。
一. Qt 文件操作核心类概述
- Qt 文件操作主要依赖两个核心类,分工明确:
QFile:负责文件的底层读写操作(打开、读取、写入、关闭),支持文本 / 二进制文件,跨平台兼容;QFileInfo:负责获取文件 / 目录的属性信息(文件名、大小、创建时间、是否为目录等),无需打开文件即可查询。
- 核心优势 :
- 跨平台 :自动适配不同系统的文件路径格式(Windows 用
\,Linux/macOS 用/); - 接口简洁 :提供
readAll()、write()等高层接口,无需手动处理缓冲区; - 安全可靠:支持多种打开模式(只读、只写、追加等),避免文件损坏。
- 跨平台 :自动适配不同系统的文件路径格式(Windows 用

二. QFile 核心:文件读写实战
2.1 关键前提:文件打开模式
使用 QFile 前必须指定打开模式,通过 open() 方法启用,不同模式对应不同场景,核心模式如下:
| 打开模式 | 说明 | 适用场景 |
|---|---|---|
QIODevice::ReadOnly |
只读模式,文件不存在则打开失败 | 读取配置文件、日志文件 |
QIODevice::WriteOnly |
只写模式,文件不存在则创建,存在则清空原有内容(默认截断) | 新建文件、覆盖写入 |
QIODevice::ReadWrite |
读写模式,支持读取和写入 | 编辑文件、数据更新 |
QIODevice::Append |
追加模式,文件不存在则创建,写入内容追加到文件末尾 | 日志记录、累加数据写入 |
QIODevice::Text |
文本模式,读写时自动转换行尾符(Windows \r\n ↔ Linux \n) | 文本文件(.txt、.ini 等) |
QIODevice::Unbuffered |
无缓冲模式,绕过缓冲区直接读写,适用于大文件或实时性要求高的场景 | 大文件传输、设备文件操作 |
QIODevice::NewOnly |
仅新建模式,文件已存在则打开失败 | 避免覆盖已有重要文件 |
- 注意 :模式可组合使用,例如
QIODevice::ReadWrite | QIODevice::Text表示 "文本模式下的读写"。

2.2 实战示例1:文本文件读写(简易记事本)
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPlainTextEdit>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 获取到菜单栏
this->setWindowTitle("简单的记事本");
// 获取到菜单栏
QMenuBar* menubar = this->menuBar();
// 添加菜单
QMenu* menu = new QMenu("文件");
menubar->addMenu(menu);
// 添加菜单项
QAction* action1 = new QAction("打开");
QAction* action2 = new QAction("保存");
menu->addAction(action1);
menu->addAction(action2);
// 指定一个输入框
edit = new QPlainTextEdit();
QFont font;
font.setPixelSize(20);
edit->setFont(font);
this->setCentralWidget(edit);
// 连接 QAction 的信号槽
connect(action1, &QAction::triggered, this, &MainWindow::handle1);
connect(action2, &QAction::triggered, this, &MainWindow::handle2);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handle1()
{
// 1. 先弹出 "打开文件" 对话框,让用户选择打开哪个文件
QString path = QFileDialog::getOpenFileName(this);
// 2. 把文件名显示到状态栏里
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
// 3. 根据用户选择的路径, 构造一个 QFile 对象,并打开文件
QFile file(path);
bool ret = file.open(QIODevice::ReadOnly);
if(!ret){
statusBar->showMessage(path + "打开失败");
return;
}
// 4. 读取文件
// 需要确保打开的文件是一个文本文件才可以
// 如果是二进制文件,交给QString就不太合理了
QString text = file.readAll();
// 5. 关闭文件(千万不要忘记)
file.close();
// 6. 读到的内容设置到输入框中
edit->setPlainText(text);
}
void MainWindow::handle2()
{
// 1. 先弹出一个 "保存文件" 对话框
QString path = QFileDialog::getSaveFileName(this);
// 2. 在状态栏显示这个文件名
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
// 3. 根据用户选择的路径, 构造一个 QFile 对象,并打开文件
QFile file(path);
bool ret = file.open(QFile::WriteOnly);
if(!ret){
statusBar->showMessage(path + "保存失败");
return;
}
// 4. 写文件
const QString& text = edit->toPlainText();
file.write(text.toUtf8());
// 5. 关闭文件
file.close();
}

2.3 实战示例2:二进制文件读写(适用于图片 / 视频 / 二进制数据)
二进制文件(图片、视频、exe 等)需避免文本模式的行尾符转换,下面的这个示例是博主借鉴的哈,大家可以看看,可以验证下正确性。
cpp
// 读取二进制文件(如图片)
void Widget::readBinaryFile()
{
QString filePath = QFileDialog::getOpenFileName(this, "选择图片", ".", "图片文件 (*.jpg *.png)");
if (filePath.isEmpty()) return;
QFile file(filePath);
// 二进制只读模式
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, "错误", "文件打开失败:" + file.errorString());
return;
}
// 读取全部二进制数据
QByteArray imageData = file.readAll();
file.close();
// 后续可用于显示图片、网络传输等
QPixmap pixmap;
pixmap.loadFromData(imageData);
ui->label_image->setPixmap(pixmap.scaled(ui->label_image->size(), Qt::KeepAspectRatio));
}
// 写入二进制文件(如保存图片)
void Widget::writeBinaryFile(const QByteArray& data, const QString& savePath)
{
QFile file(savePath);
// 二进制只写模式
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::warning(this, "错误", "文件创建失败:" + file.errorString());
return;
}
file.write(data);
file.close();
QMessageBox::information(this, "成功", "二进制文件保存成功!");
}
关键注意事项:
- 必须关闭文件 :
open()后需调用close(),释放文件句柄,避免资源泄露; - 编码处理 :文本文件建议用
toUtf8()写入,避免中文乱码; - 大文件处理 :避免
readAll()(一次性加载到内存),改用readLine()逐行读取或read(n)分块读取; - 路径处理 :使用
QFileDialog获取路径,自动适配跨平台格式,避免手动拼接路径出错。
三. QFileInfo 核心:文件属性获取
QFileInfo 无需打开文件即可获取文件属性,常用于文件筛选、校验、信息展示等场景,核心接口如下:
| 接口方法 | 说明 |
|---|---|
fileName() |
获取文件名(含后缀,如 "test.txt") |
baseName() |
获取文件名(不含后缀,如 "test") |
suffix() |
获取文件后缀名(如 "txt"、"jpg") |
size() |
获取文件大小(单位:字节) |
path() |
获取文件路径(不含文件名,如 "C:/Users/Desktop") |
isFile() |
判断是否为文件(非目录) |
isDir() |
判断是否为目录 |
isExecutable() |
判断是否为可执行文件 |
created() |
获取文件创建时间 |
lastModified() |
获取文件最后修改时间 |

实战示例:文件属性获取显示
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString path = QFileDialog::getOpenFileName(this);
QFileInfo fileInfo(path);
qDebug() << fileInfo.fileName();
qDebug() << fileInfo.suffix();
qDebug() << fileInfo.path();
qDebug() << fileInfo.size();
qDebug() << fileInfo.isFile();
qDebug() << fileInfo.isDir();
// ............
}
四. 避坑指南(新手必看)
- 路径问题 :避免手动拼接路径,优先使用
QFileDialog获取,或用QDir::toNativeSeparators()转换为系统兼容格式; - 编码问题 :文本文件读写统一用
UTF-8编码(toUtf8()),避免中文乱码; - 文件权限:写入文件时确保目标路径有写权限(如 Windows 桌面、Linux /tmp 目录);
- 大文件处理 :禁用
readAll(),改用分块读取 / 写入,防止内存溢出; - 资源释放 :
open()后必须调用close(),即使中途出错也要关闭(可搭配QScopeGuard自动释放)。
结尾:
html
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:Qt 的 QFile 和 QFileInfo 类封装了底层文件操作细节,跨平台兼容性强,接口简洁易用,足以覆盖日常开发中的绝大多数文件处理场景。本文的实战代码可直接复制到项目中使用,只需根据具体需求调整路径和逻辑。掌握这些技巧后,无论是日志存储、配置读写还是文件传输,都能高效实现。如果需要处理更复杂的场景(如大文件断点续传、网络文件下载),可结合 QSaveFile(安全保存)、QTemporaryFile(临时文件)等扩展类。
✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど
