Qt 文件:QFile 文件读写与管理教程
主要介绍Qt文件系统,包括输入输出、读取、写入文件,如何将文件与mainwindow结合运用
·
2. Qt 文件
2.1 Qt 文件概述
文件操作是应用程序核心功能,Qt 提供跨平台文件操作类,支持文件读写、信息获取、复制重命名等,核心类包括 QFile、QFileInfo、QIODevice 等。
2.2 输入输出设备类
QIODevice 是所有 I/O 设备基类,QFileDevice 继承于 QIODevice,QFile 继承于 QFileDevice。
| 类名 | 功能描述 |
|---|---|
| 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: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;
}
更多推荐



所有评论(0)