【QT】文件类(QFile)

很高兴你能看到这篇文章,同时我的语雀文档也更新了许多嵌入式系列的学习笔记希望能帮到你 :
https://www.yuque.com/alive-m4b9n

目录

QFile 是 Qt 提供的一个用于文件操作的类,继承自 QIODevice ,用于处理文件的读取、写入、删除等操作。

使用前需要引入头文件

QFile 主要功能

  • 打开文件
  • 读取数据
  • 写入数据
  • 删除文件
  • 检查文件状态
  • 复制和重命名文件

QFile 支持文本和二进制模式 ,可以用 QTextStreamQDataStream 进行高效的文件操作。

QFile 操作步骤

1️⃣ 创建 QFile 对象

cpp 复制代码
//构造函数
QFile(const QString &name, QObject *parent)
QFile(QObject *parent)
QFile(const QString &name)

---------示例--------------
QFile file("test.txt");

2️⃣ 调用 open()以指定模式打开文件

cpp 复制代码
 bool open(FILE *fh, QIODevice::OpenMode mode,  //通过文件路径打开
            QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
 bool open(int fd, QIODevice::OpenMode mode, 	//通过fd文件描述符打开
            QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

------------------示例-----------------
QFile file("test.txt");
file.open(QIODevice::ReadWrite | QIODevice::Text);

打开模式如下,需要多个模式时用 |隔开

模式 描述
ReadOnly 只读模式
WriteOnly 只写模式
ReadWrite 读写模式
Append 追加模式(不会覆盖已有内容)
Text 以文本模式打开(自动转换换行符)
Truncate 清空文件内容

3️⃣ 文件操作:读或者写

cpp 复制代码
//读
QByteArray QIODevice::read(qint64 maxSize) //读取最大maxsize的数据
QByteArray QIODevice::readAll()  //读取文件所有数据,返回QByteArray数组
//写
qint64 write(const QByteArray &byteArray) //QByteArray 数据
qint64 write(const char *data, qint64 maxSize)  //char* 指针,数据大小

----------示例-----------
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QByteArray content = file.readAll();
    qDebug() << "文件内容:\n" << content;
    file.close();
}

4️⃣ 关闭

cpp 复制代码
void QFileDevice::close()

QFile 其他常用函数

类别 函数 作用 示例代码
文件基本操作 exists() 判断文件是否存在 if (file.exists()) qDebug() << "文件存在"
remove() 删除文件 file.remove();
copy(src, dst) 复制文件 QFile::copy("test.txt", "backup.txt");
rename(old, new) 重命名/移动文件 file.rename("new_name.txt");
flush() 刷新缓冲区 file.flush();
文件信息 size() 获取文件大小(字节) qDebug() << file.size();
fileName() 获取文件名(可能是相对路径) qDebug() << file.fileName();
absoluteFilePath() 获取文件的绝对路径 qDebug() << QFileInfo(file).absoluteFilePath();
permissions() 获取文件权限 qDebug() << file.permissions();
setPermissions() 修改文件权限 file.setPermissions(QFileDevice::ReadOwner)
读写文件 isReadable() 是否可读 if (file.isReadable()) qDebug() << "可读";
isWritable() 是否可写 if (file.isWritable()) qDebug() << "可写";
文件状态 isOpen() 判断文件是否已打开 if (file.isOpen()) qDebug() << "文件已打开";
isWritable() 判断文件是否可写 if (file.isWritable()) qDebug() << "文件可写";
handle() 获取底层文件句柄 int fd = file.handle();

案例分析及实现

需求

  • 打开文件对话框,获取文件路径名,然后通过文件操作将文件内容显示到输入框上
  • 点击另存为按钮可以保存当前文件到其他地方去。

功能一实现:打开文件并显示

思路

1️⃣ 打开文件选择对话框QFileDialog::getOpenFileName

2️⃣ 获取用户选择的文件路径

3️⃣ 使用 QFile读取文件内容 4️⃣ 将内容显示到 QTextEdit

mainwindow.h

cpp 复制代码
private slots:
void on_openButton_clicked();  // 打开文件
void on_saveAsButton_clicked(); // 另存为

private:
Ui::MainWindow *ui;
QString currentFilePath;  // 存储当前文件路径

mainwindow.cpp

cpp 复制代码
//打开文件
void MainWindow::on_openButton_clicked()
{
    //打开文件对话框,获取文件路径
    QString filePath = QFileDialog::getOpenFileName(this,"选择文件","","文本文件(*.txt);;所有文件(*.*)");

    if(filePath.isEmpty())
    {
        qDebug()<<"未选择文件";
        return;
    }

    qDebug() << "选择的文件路径:" << filePath;
    currentFilePath = filePath; //记录当前的文件路径

    //打开文件
    QFile file(filePath);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug()<<"文件打开失败"<<file.errorString();//输出错误信息
        return;
    }

    //读取文件内容
    QTextStream in(&file);
    QString fileContent = in.readAll();
    file.close();

    //显示到QtextEdit上
    ui->textEdit->setText(fileContent);
}

效果

功能二实现:另存为

mainwindow.cpp

cpp 复制代码
// 另存为
void MainWindow::on_saveAsButton_clicked()
{
    // 打开文件对话框,获取保存路径
    QString saveFilePath = QFileDialog::getSaveFileName(this, "另存为", "",
                                                        "文本文件 (*.txt);;所有文件 (*.*)");

    if (saveFilePath.isEmpty()) {
        qDebug() << "未选择保存路径";
        return;
    }

    qDebug() << "保存文件路径:" << saveFilePath;

    // 打开文件
    QFile file(saveFilePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "文件保存失败:" << file.errorString();
        return;
    }

    // 获取 QTextEdit 中的内容
    QString content = ui->textEdit->toPlainText();

    // 写入文件
    QTextStream out(&file);
    out << content;
    file.close();

    qDebug() << "文件保存成功";
}

效果

相关推荐
码视野8 分钟前
基于物联网的智能家居监控系统设计和实现(源码+论文+部署讲解等)
物联网·智能家居
双叶83637 分钟前
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
c语言·开发语言·数据结构·c++
TDengine (老段)1 小时前
TDengine 在金融领域的应用
大数据·数据库·物联网·金融·时序数据库·tdengine·涛思数据
格林威1 小时前
Baumer工业相机堡盟工业相机的工业视觉是否可以在室外可以做视觉检测项目
c++·人工智能·数码相机·计算机视觉·视觉检测
追烽少年x1 小时前
C++11异步编程 --- async
c++
小宋加油啊2 小时前
Mac QT水平布局和垂直布局
开发语言·qt·macos
猎板阿权2 小时前
出于PCB设计层面考虑,连排半孔需要注意哪些事项?
单片机·物联网·平面
虾球xz2 小时前
游戏引擎学习第277天:稀疏实体系统
c++·学习·游戏引擎
想睡hhh2 小时前
c++进阶——哈希表的实现
开发语言·数据结构·c++·散列表·哈希
行思理2 小时前
JIT+Opcache如何配置才能达到性能最优
c++·php·jit