Qt 文件:QFile 文件读写与管理教程

文章目录

  • [2. Qt 文件](#2. Qt 文件)
    • [2.1 Qt 文件概述](#2.1 Qt 文件概述)
    • [2.2 输入输出设备类](#2.2 输入输出设备类)
    • [2.3 文件读写类](#2.3 文件读写类)
    • [2.4 文件和目录信息类](#2.4 文件和目录信息类)

2. Qt 文件

2.1 Qt 文件概述

文件操作是应用程序核心功能,Qt 提供跨平台文件操作类,支持文件读写、信息获取、复制重命名等,核心类包括 QFile、QFileInfo、QIODevice 等。

2.2 输入输出设备类

QIODevice 是所有 I/O 设备基类,QFileDevice 继承于 QIODevice,QFile 继承于 QFileDevice。
<<abstract>>
QIODevice
<<abstract>>
QFileDevice
<<abstract>>
QAbstractSocket
QSerialPort
QBluetoothSocket
QProcess
QBuffer
QFile
QSaveFile
QTemporaryFile
QTcpSocket
QUdpSocket

类名 功能描述
QFile 基础文件操作类,支持任意格式文件读写
QSaveFile 安全保存文件,先写入临时文件,成功后再写入目标文件,避免数据丢失
QTemporaryFile 创建唯一临时文件,对象销毁时自动删除
QTcpSocket/QUdpSocket 网络 TCP/UDP 通信
QSerialPort 串口通信
QBluetoothSocket 蓝牙通信
QProcess 启动外部程序并传递参数
QBuffer 以 QByteArray 为缓冲区的 I/O 设备

2.3 文件读写类

核心函数

你希望把表格中函数原型的反引号全部去掉,仅保留纯文本的函数原型和简要功能说明,我已按你的要求调整完成:

函数原型 功能说明
bool open(QIODevice::OpenMode mode) 打开文件,指定打开模式,返回是否成功
QByteArray readAll() 读取文件全部数据,返回字节数组
QByteArray readLine() 读取文件中一行数据,返回字节数组
QByteArray read(qint64 maxSize) 读取指定字节数的文件数据
qint64 write(const QByteArray &data) 写入字节数组数据,返回实际写入字节数
qint64 writeData(const char *data, qint64 len) 底层写入指定长度的字符数据
void close() 关闭文件,释放文件句柄
QFile(const QString &fileName) 构造函数,关联指定路径的文件
void setFileName(const QString &fileName) 设置QFile关联的文件路径
QString fileName() const 获取当前关联的文件路径
bool exists() const 检查文件是否存在
bool remove() 删除关联的文件,返回是否成功
bool rename(const QString &newName) 重命名文件,返回是否成功
bool copy(const QString &newName) 复制文件到新路径,返回是否成功
qint64 size() const 获取文件的字节大小

打开模式

模式 描述
QIODevice::NotOpen 未打开
QIODevice::ReadOnly 只读模式
QIODevice::WriteOnly 只写模式(默认覆盖文件,结合 Append/ReadOnly 可修改)
QIODevice::ReadWrite 读写模式
QIODevice::Append 追加模式,数据写入文件末尾
QIODevice::Truncate 截断模式,打开后清空原内容
QIODevice::Text 文本模式,读写时自动转换行尾符(\n ↔ 本地编码如 \r\n)
QIODevice::Unbuffered 无缓冲模式,绕过缓冲区
QIODevice::NewOnly 仅新建模式,文件已存在则打开失败
  1. 示例1:读取文件内容
  • 步骤1:UI 设计
  • 拖入 LineEdit(显示文件路径)、PushButton(选择文件)、TextEdit(显示文件内容)。
  • 步骤2:在 widget.cpp 中实现功能
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    
    // 点击按钮选择文件并读取
    connect(ui->btn, &QPushButton::clicked, [=]() {
        // 弹出文件选择对话框,默认路径为桌面
        QString path = QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\Lenovo\\Desktop");
        ui->lineEdit->setText(path);
        
        // 实例化 QFile 对象
        QFile file(path);
        // 以只读模式打开文件
        if (file.open(QIODevice::ReadOnly)) {
            // 读取全部内容
            QString str = file.readAll();
            // 显示到 TextEdit
            ui->textEdit->setText(str);
            // 关闭文件
            file.close();
        }
    });
}
  • 示例2:写文件(追加模式)
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    
    connect(ui->btn, &QPushButton::clicked, [=]() {
        QString path = QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\Lenovo\\Desktop");
        ui->lineEdit->setText(path);
        
        QFile file(path);
        // 以追加模式打开文件
        if (file.open(QIODevice::Append)) {
            // 写入内容
            file.write("【这是示例!!!】");
            file.close();
        }
    });
}
  • 综合运用:
cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setMenuBar(this->menuBar());
    QMenu* menu1=new QMenu("文件(&F)");
    menuBar()->addMenu(menu1);

    QAction* action1=new QAction("打开文件");
    action1->setShortcut(QKeySequence(Qt::ControlModifier+ Qt::Key_N));
    QAction* action2=new QAction("保存文件");
    action2->setShortcut(QKeySequence(Qt::ControlModifier+ Qt::Key_O));
    menu1->addAction(action1);
    menu1->addAction(action2);

    this->setCentralWidget(ui->textEdit);

    connect(action1,&QAction::triggered,this,&MainWindow::handleraction1);
    connect(action2,&QAction::triggered,this,&MainWindow::handleraction2);
}

void MainWindow::handleraction1()
{
    QString str=QFileDialog::getOpenFileName(this,"选择一个文件","C:/");
    QStatusBar* statusbar=this->statusBar();
    this->setStatusBar(this->statusBar());

    statusbar->showMessage(str);

    QFile file(str);
    bool ret=file.open(QIODevice::ReadOnly);
    if(ret==false) return;
    else
    {
        QString text=file.readAll();
        ui->textEdit->setText(text);
    }
    file.close();
}

void MainWindow::handleraction2()
{
    QString str=QFileDialog::getSaveFileName(this,"选择一个文件","C:/");
    QStatusBar* statusbar=this->statusBar();
    this->setStatusBar(this->statusBar());

    statusbar->showMessage(str);

    QFile file(str);
    bool ret=file.open(QIODevice::WriteOnly);
    if(ret==false) return;
    else
    {
        QString text=ui->textEdit->toPlainText();
        file.write(text.toUtf8());
    }
    file.close();
}


MainWindow::~MainWindow()
{
    delete ui;
}

2.4 文件和目录信息类

核心类:QFileInfo,用于获取文件/目录的元信息,无需打开文件即可获取。

常用函数

函数 功能
isDir() 判断是否为目录
isExecutable() 判断是否为可执行文件
fileName() 获取文件名(含后缀)
completeBaseName() 获取完整文件名(不含后缀)
suffix() 获取文件后缀名
completeSuffix() 获取完整后缀名(如 .tar.gz)
size() 获取文件大小(字节)
isFile() 判断是否为文件
fileTime(QFileDevice::FileTime type) 获取文件时间(创建/修改/访问)
path() 获取文件路径(不含文件名)
lastModified() 获取最后修改时间
  • 示例:获取文件信息
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    
    connect(ui->btn, &QPushButton::clicked, [=]() {
        QString path = QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\Lenovo\\Desktop");
        
        // 实例化 QFileInfo 对象
        QFileInfo fileinfo(path);
        
        // 输出文件信息
        qDebug() << "文件名为:" << fileinfo.fileName().toUtf8().data();
        qDebug() << "后缀名为:" << fileinfo.suffix().toUtf8().data();
        qDebug() << "文件大小为:" << fileinfo.size();
        qDebug() << "文件路径为:" << fileinfo.path().toUtf8().data();
        qDebug() << "是否为文件:" << fileinfo.isFile();
        
        // 创建时间(FileBirthTime)
        QDateTime time1 = fileinfo.fileTime(QFileDevice::FileBirthTime);
        qDebug() << "创建时间为:" << time1.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
        
        // 最后修改时间
        QDateTime time2 = fileinfo.lastModified();
        qDebug() << "最后修改时间为:" << time2.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
        
        qDebug() << "是否为目录:" << fileinfo.isDir();
    });
}

Widget::~Widget() {
    delete ui;
}
相关推荐
阿班d2 小时前
4444444
c++
午安~婉2 小时前
整理知识点
前端·javascript·vue
linweidong2 小时前
C++如何避免 ODR(One Definition Rule)冲突?
java·jvm·c++
朔北之忘 Clancy2 小时前
第二章 分支结构程序设计(3)
c++·算法·青少年编程·竞赛·教材·考级·讲义
军军君012 小时前
Three.js基础功能学习十二:常量与核心
前端·javascript·学习·3d·threejs·three·三维
uoKent2 小时前
构造析构综合练习
c++
m0_748254662 小时前
CSS AI 编程
前端·css·人工智能
aini_lovee3 小时前
基于Qt实现CAN通信上位机
开发语言·qt
FL16238631293 小时前
[C++][cmake]基于C++在windows上onnxruntime+opencv部署yolo26-seg的实例分割onnx模型
c++·windows·opencv