目录
1. Qt 文件概述
2. 输入输出设备类
3. QFile 类的使用
3.1 打开 open
3.2 读 read / readLine / readAll
3.3 写 wirte
3.4 关闭 close
3.5 QFile 类的基本用法
4. 文件和目录信息
1. Qt 文件概述
⽂件操作是应⽤程序必不可少的部分。Qt 作为⼀个通⽤开发库,提供了跨平台的⽂件操作能⼒。 Qt提供了很多关于⽂件的类,通过这些类能够对⽂件系统进⾏操作,如⽂件读写、⽂件信息获取、文件复制或重命名等。
2. 输入输出设备类
在 Qt 中,⽂件读写的类为 QFile 。QFile 的⽗类为 QFileDevice ,QFileDevice 提供了⽂件交互操作的底层功能。 QFileDevice 的⽗类是 QIODevice,QIODevice 的⽗类为 QObject 。
QIODevice 是 Qt 中所有输⼊输出设备(input/output device,简称 I/O 设备)的基础类,I/O 设备就是能进⾏数据输⼊和输出的设备,例如⽂件是⼀种 I/O 设备,⽹络通信中的 socket 是 I/O 设备, 串⼝、蓝⽛等通信接⼝也是 I/O 设备,所以它们也是从 QIODevice 继承来的。Qt 中主要的⼀些 I/O 设备类的继承关系如下图所示:
3. QFile 类的使用
用 QFile 之前先使用构造函数完成文件对象的构造:
需要提供文件路径:绝对路径和相对路径都可以
3.1 打开 open
使用上面的两种方法,还需要C语言的API,比较麻烦
构造函数中,指定了路径之后,此时直接通过这个版本的 open 打开即可。
OpenMode mode:读方式 / 写方式 / 追加写 方式打开。
3.2 读 read / readLine / readAll
QByteArray 是可以很方便的转成 QString 的。
3.3 写 wirte
3.4 关闭 close
关闭本质上是要释放文件描述符表中的表项,文件描述符表存在上限。如果一直打开,不关闭的话,就可能会使文件描述符表被占满,后续再尝试打开,就打开不了了。
3.5 QFile 类的基本用法
// mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPlainTextEdit> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void handleAction1(); void handleAction2(); private: Ui::MainWindow *ui; QPlainTextEdit* edit; }; #endif // MAINWINDOW_H// mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->setWindowTitle("简单的记事本"); // 获取到菜单栏 QMenuBar* menuBar = this->menuBar(); // 添加菜单 QMenu* menu = new QMenu("文件"); menuBar->addMenu(menu); // 添加菜单项 QAction* action1 = new QAction("打开"); QAction* action2 = new QAction("保存"); menu->addAction(action1); menu->addAction(action2); // 指定一个输入框 edit = new QPlainTextEdit(); QFont font; font.setPixelSize(24); edit->setFont(font); this->setCentralWidget(edit); // 连接 QAction 的信号槽 connect(action1, &QAction::triggered, this,&MainWindow::handleAction1); connect(action2, &QAction::triggered, this,&MainWindow::handleAction2); } MainWindow::~MainWindow() { delete ui; } void MainWindow::handleAction1() { // 1. 先弹出 “打开文件” 对话框,让用户选择打开哪个文件 QString path = QFileDialog::getOpenFileName(this); // 2. 把文件名显示到状态中 QStatusBar* statusBar = this->statusBar(); statusBar->showMessage(path); // 3. 根据用户选择的路径,构造一个 QFile 对象,并打开文件 QFile file(path); bool ret = file.open(QIODevice::ReadOnly); if(!ret){ // 打开文件失败! statusBar->showMessage(path + "打开失败!"); } // 4. 读取文件 QString text = file.readAll(); // 需要确保打开的文件是一个文本文件才可以,如果是二进制文件,交给 QString 就不合适了 // 二进制文件,里面的内容存啥都行,没有限制,图片,可执行程序,视频,音频…… // 文本文件,里面的内容必须是合法字符(遵守utf8,gbk等编码方式) // 5.关闭文件!!! file.close(); // 6. 读到的内容设置到输入框中 edit->setPlainText(text); } void MainWindow::handleAction2() { // 1. 先弹出保存文件对话框 QString path = QFileDialog::getSaveFileName(); // 2. 在状态栏中显示这个文件名 QStatusBar* statusBar = this->statusBar(); statusBar->showMessage(path); // 3. 根据用户选择的路径,构造一个 QFile 对象,并打开文件 QFile file(path); bool ret = file.open(QIODevice::WriteOnly); if(!ret){ statusBar->showMessage(path + "打开失败!"); return; } // 4. 写文件 const QString& text = edit->toPlainText(); file.write(text.toUtf8()); // 5. 关闭文件 file.close(); }运行:
保存文件操作:
确实在对应的路径下存在该文件:
打开文件操作:
4. 文件和目录信息
QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件大小、⽂件修改⽇期等。QFileInfo类中提供了很多的⽅法,常⽤的有:
- isDir() 检查该⽂件是否是⽬录;
- isExecutable() 检查该⽂件是否是可执⾏⽂件;
- fileName() 获得⽂件名;
- completeBaseName() 获取完整的⽂件名;
- suffix() 获取⽂件后缀名;
- completeSuffix() 获取完整的⽂件后缀;
- size() 获取⽂件大小;
- isFile() 判断是否为⽂件;
- fileTime() 获取⽂件创建时间、修改时间、最近访问时间等;
运行: