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 中实现功能
#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:写文件(追加模式)
#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();
        }
    });
}
  • 综合运用:
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() 获取最后修改时间
  • 示例:获取文件信息
#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;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐