Qt文件操作:QFile读写全解析


🔥草莓熊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() 等高层接口,无需手动处理缓冲区;
    • 安全可靠:支持多种打开模式(只读、只写、追加等),避免文件损坏。

二. 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(临时文件)等扩展类。

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど

相关推荐
一个努力编程人1 小时前
NLP 领域————RoBERTa
人工智能·深度学习·自然语言处理
S-码农1 小时前
Linux——互斥锁
linux·开发语言
一路往蓝-Anbo1 小时前
第 10 章:OpenAMP 实战——构建 M33 与 Linux 的 RPMsg 消息隧道
linux·运维·服务器·驱动开发·stm32·单片机·嵌入式硬件
王解1 小时前
第十篇:实战演练 —— 用 nanobot 打造一个私人助手
人工智能·ai agent·nanobot
Starry_hello world1 小时前
Linux 网络(6)
linux·运维·网络
DeepModel1 小时前
【回归算法】广义线性模型(GLM)详解
人工智能·算法·回归
隔壁大炮1 小时前
02.深度学习——简介
人工智能·深度学习·神经网络
Drifter_yh1 小时前
「JVM」 Java 类加载机制与双亲委派模型深度解析
java·开发语言·jvm
D_evil__1 小时前
【Effective Modern C++】第六章 lambda表达式:34. 考虑lambda而非bind
c++