【Qt教程】4.1 - Qt5 文件系统 QFile文件读写操作

1. Qt文件系统简介 - QFile

文件系统是应用程序必不可少的部分。Qt作为一个通用开发库,提供了跨平台的文件操作能力。Qt通过 QIODevice 提供了对I/O设备的抽象,使这些设备具有读写字节块的能力。

在所有的I/O设备中,文件I/O是最重要的部分之一。QFile提供了从文件中读取和写入数据的能力。我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象后,使用 setFileName()来修改。

QFile 主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用 QDataStream或 QTextStream类来读写文件,也可以使用 QIODevice类提供的 read()、readLine()、readAll()以及 write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过 QFileInfo获取,而不是自己分析文件路径字符串。

GitHub源码仓库:Qt学习例程

2. 示例需求及流程

  • 需求:新建QWidget工程,创建这样一个界面工程。选择文件后,会将文件路径显示到 lineEdit里,并且将文档内容显示在 textEdit中。

例程功能执行过程

按键关联消息槽,弹出文件对话框,打开文件,输出路径。

读内容有两种方式:(默认utf-8,可以指定格式gbk,不过很麻烦。)

  • file.readAll();,全部读取

  • file.readLine();,按行读,读到文件行尾。

打开后,别忘记关闭文件对象。

写文件。

按照指定的日期时间格式,输出文件创建日期 和最后修改日期。

打开文件的方式:

日期时间的格式编码方法:

3. 示例源码、现象

GitHub源码仓库:Qt学习例程

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QTextCodec>
#include <QDateTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 点击选取文件按钮,弹出文件对话框
    connect(ui->pushButton, &QPushButton::clicked, [=](){

        // 用打开的方式打开一个文件对话框
        // 打印选中该的路径名称。参数:父对象,对话框标题,默认打开路径,过滤的文件格式
        QString path = QFileDialog::getOpenFileName(this, "open",
                                                    "../",
                    "Text(*.txt);;souce(*.cpp *.h);;all(*.*)");
        // 调试输出选择路径
        qDebug() << path;
        // 将路径显示到 lineEdit
        ui->lineEdit->setText(path);

        // 指定操作文件格式,只能指定一种格式,所以指定gbk时读utf-8的会出错
        //QTextCodec * codec = QTextCodec::codecForName("gbk");

        // 读取txt内容,放入到 textEdit中
        // QFile默认支持的格式是 utf-8
        // 输入打开文件的文件路径
        QFile file(path);
        // 打开方式:只读/只写/读写/追加
        file.open(QIODevice::ReadOnly);

        // 全部读取
        //QByteArray array = file.readAll();
        // 按行读,追加到array,直到读到行尾
        QByteArray array;
        while(!file.atEnd())
        {
            array += file.readLine();
        }

        ui->textEdit->setText(array);
        //ui->textEdit->setText(codec->toUnicode(array));

        // 关闭文件对象
        file.close();

        // 用追加方式进行写文件
        /*file.open(QIODevice::Append);
        file.write("aaaaaaaaa");
        // 关闭文件对象
        file.close();*/

        // QFileInfo 文件信息类
        QFileInfo info(path);
        qDebug() << "大小:" << info.size() << "Bytes 后缀名:" << info.suffix()
                 << " 文件名称:" << info.fileName() << " 文件路径:" << info.filePath();
        // 显示 创建日期
        qDebug() << "创建日期:" << info.created().toString("yyyy/MM/dd hh:mm:ss");
        qDebug() << "创建日期:" << info.birthTime().toString("yyyy/MM/dd hh:mm:ss");
        // 显示 最后修改日期
        qDebug() << "最后修改日期:" << info.metadataChangeTime().toString("yyyy/MM/dd hh:mm:ss");
        qDebug() << "最后修改日期:" << info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
    });
}

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

文件对话框选择目录中的.txt文档,结果如下:

猜你喜欢

转载自blog.csdn.net/Mark_md/article/details/108920508