目录
一、Qt文件概述
二、输入输出设备类
三、文件读写类
四、文件和目录信息类
一、Qt文件概述
文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。这些方法都是封装了系统的API,Qt 中也提供了一套文件操作的API,而且也更推荐使用这一套。
二、输入输出设备类
在 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 设备类的继承关系如下图所示:
- QFile:用于文件操作和⽂件数据读写的类,使用 QFile 可以读写任意格式的文件。
- QSaveFile:用于安全保存文件的类。使用 QSaveFile 保存⽂件时,它会先把数据写入一个临时文件,成功提交后才将数据写⼊最终的⽂件。如果保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。 在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等。
- QTemporaryFile:用于创建临时文件的类。使用函数 QTemporaryFile::open() 就能创建⼀个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除。
- QTcpSocket 和 QUdpSocket:分别实现了 TCP 和 UDP 的类。
- QSerialPort:实现了串口通信的类,通过这个类可以实现计算机与串口设备的通信。
- QBluetoothSocket:用于蓝牙通信的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑一般也有蓝牙通信模块。通过 QBluetoothSocket 类,就可以编写蓝牙通信程。如编程实现笔记本电脑与手机的蓝牙通信。
- QProcess:用于启动外部程序,并且可以给程序传递参数。
- QBuffer:以⼀个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作⼀个 I/O 设备来读写。
三、文件读写类
在 Qt 中,文件的读写主要是通过 QFile 类来实现。在 QFile 类中提供了一些用来读写文件的方法。对于文件的操作主要有:
- 读数据:QFile 类中提供了多个方法用于读取文件内容;如 read()、readAll()、readLine() 等。
- 写数据:QFile 类中提供了多个方法用于往文件中写内容;如 write()、writeData() 等。
- 关闭文件:文件使用结束后必须⽤函数 close() 关闭文件。
访问一个设备之前,需要使用 open() 函数 打开该设备,而且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义,其取值如下:
QIODevice::NotOpen | 没有打开设备 |
QIODevice::ReadOnly | 以只读方式打开设备 |
QIODevice::WriteOnly | 以只写方式打开设备 |
QIODevice::ReadWrite | 以读写方式打开设备 |
QIODevice::Append | 以追加方式打开设备,将数据写到文件末尾 |
QIODevice::Truncate | 每次打开文件后重写文件内容,原内容将被删除 |
QIODevice::Text | 读文件时,行尾终止符会转换为'\n' 写文件时,行尾终止符会被转换为本地编码。如Win32上为'\r\n' |
QIODevice::Unbuffered | 无缓冲形式打开文件,绕过设备中的任何缓冲区 |
QIODevice::NewOnly | 文件存在则打开失败,不存在则创建文件 |
代码示例:简易记事本
在 "mainwindow.h" 文件中声明edit成员和两个方法:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPlainTextEdit>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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(20);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 + " 打开失败 ");return;};// 4. 读取文件QString text = file.readAll(); // 需要确保打开的文件是一个文本文件,不能是二进制文件// 5. 关闭文件file.close();// 6. 将读取到的内容输入到输入框edit->setPlainText(text);
}void MainWindow::handleAction2()
{// 1. 先弹出"保存文件"对话框QString path = QFileDialog::getSaveFileName(this);// 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();
}
先在QPlainTextEdit中输入一些内容,点击文件再点击保存,保存到指定路径,输入文件名,这样就保存成功了。关闭程序,再次运行,这次输入框中什么也没有,点击文件再点击打开,找到刚才保存的文件,这样就打开成功了。
四、文件和目录信息类
QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件⼤⼩、⽂件修改⽇期等。
常用方法:
常用方法 | 说明 |
---|---|
isDir() | 检查该⽂件是否是⽬录 |
isExecutable() | 检查该⽂件是否是可执⾏⽂件 |
fileName() | 获得⽂件名 |
completeBaseName() | 获取完整的⽂件名 |
suffix() | 获取⽂件后缀名 |
completeSuffix() | 获取完整的⽂件后缀 |
size() | 获取⽂件⼤⼩ |
isFile() | 判断是否为⽂件 |
fileTime() | 获取⽂件创建时间、修改时间、最近访问时间等 |
在C++17标准库中引入了filesystem文件系统库来获取文件和目录的信息
示例代码:获取文件信息
#include <QFileInfo>void MainWindow::on_pushButton_clicked()
{// 弹出文件对话框,并获取到文件的属性信息QString path = QFileDialog::getOpenFileName(this);// 构造出一个QFileInfo对象QFileInfo fileinfo(path);// 打印相关属性qDebug() << fileinfo.fileName();qDebug() << fileinfo.suffix();qDebug() << fileinfo.path();qDebug() << fileinfo.size();qDebug() << fileinfo.isFile();qDebug() << fileinfo.isDir();// ...
}
点击按钮,选择文件进行查看: