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文档,结果如下: