文章目录
- 前言:
- 1. Qt 文件概述
- 2. 输入输出设备类
- 3. 文件读写类
- 3.1. 打开open
- 3.2. 读read / readline/ readAll
- 3.3. 写write
- 3.4. 关闭close
- 4. 读写文件示例
- 5. 文件件和目录信息类
- 总结:
前言:
在现代软件开发中,文件操作是应用程序与外部世界交互的基本方式之一。无论是读取用户数据、存储配置信息,还是管理临时文件,文件系统都是不可或缺的一部分。Qt,作为一个功能强大的跨平台开发框架,提供了一套全面的文件操作API,使得开发者能够在不同的操作系统上实现一致的文件处理逻辑。本篇文章将深入探讨Qt中的文件操作,包括文件的打开、读写、关闭,以及文件和目录信息的获取等核心功能。通过详细的代码示例和类介绍,读者将能够理解并掌握Qt文件操作的基本概念和实用技巧。
1. Qt 文件概述
文件操作是应用程序必不可少的部分。Qt 作为一个用开发库,提供了跨平台的文件操作能力。 Qt提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。
2. 输入输出设备类
- C语言中,
fopen
打开文件,fread
、fwrite
读写文件,fclose
关闭文件 - C++ 中,
fstream
打开文件,<<
、>>
读写文件,close
关闭文件 - Linux 中,
open
打开文件,read
、write
读写文件,close
关闭文件 (一般开发中很少会直接使用,主要是要理解其背后的原理)
在 Qt 中使用上述的几种方案来读写文件,也是完全可以的。(Linux 这一套,局限于 Linux 系统,Windows 上的 Qt,就需要使用 Windows api) 但是即使如此,Qt还是又封装了一套。 Qt 诞生的太早了,C++还没有“标准化”概念。
咱们在编写 Qt 程序的时候,更推荐使用 Qt 自己提供的这一套文件操作,和QString
等 Qt 内置的类可以很好的配合。
Qt中的文件操作,核心操作也是这么几个部分:打开,读,写,关闭。
QFile
类完成,完成上述文件操作。
QTemporaryFile
: 这个对象销毁,对应的文件就自动删除了
QSaveFile
: 要写入大量数据,写入文件的时候,往往会把旧的文件先清空再写,万一新的数据写写一般,结果出错了。新的数据用不了旧的数据也无了。
如果你想写一个文件,会自动的把内容写到零时文件里(不会破坏原有的文件)等到所有内容都写完了之后,再把旧文件自动删除,并且用新的文件替换旧的文件。(这种策略是一种个广泛常见)
QSerialPort
: 串口一种古老的通信方式,一般是再嵌入式系统上,开发板,通过串口来和开发板之间进行交互。
QProcess
: 相当于是对 fork
/ exec
操作进行封装。
QBuffer
:缓冲区
3. 文件读写类
QFile
QFile(const QString &name)
可以是绝对路径,也可以是相对路径
如果在文档中
QFile
中找不到这些,可以在其父类找。
3.1. 打开open
构造函数中,指定了路径之后,此时直接通过这个版本的 open
打开
OpenMode
: 读方式、写方式、追加写方式…
3.2. 读read / readline/ readAll
QByteArry
很方便转成 QString
3.3. 写write
3.4. 关闭close
关闭的本质是要释放文件描述符表中的表项;文件描述符表存在上限,如果一直打开,不关闭的话,就可能会使文件描述符表被占满,后续再尝试打开,就打开不了了。
4. 读写文件示例
#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(QFile::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(QFile::WriteOnly);
if (!ret) {
statusBar->showMessage(path + "打开失败!");
return;
}
// 4. 写文件
const QString& text = _edit->toPlainText();
file.write(text.toUtf8());
// 5. 关闭文件
file.close();
}
QString text = file.readAll();
需要确保打开的文件是一个文本文件才可以,如果是二进制文件,交给 QString
就不合适了。
二进制文件:里面的内容存啥都行,没有限制。图片,可执行程序,音频,视频…
文本文件:里面的内容必须是合法字符(遵守 utf8, gbk 等编码方式)
5. 文件件和目录信息类
QFileInfo
可以获取到 Qt 文件的相关属性。类似于这样的功能,在 C/C++ 标准库中原本是没有的,所以要想使用类似的功能往往要使用系统 api。
C++17 引入了模块,filesystem
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::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();
// ...
}
QFileInfo
还有很多操作方法:
总结:
本文详细介绍了Qt框架中关于文件操作的各个方面,从基础的文件读写到文件和目录信息的获取,为开发者提供了一套完整的文件处理解决方案。通过QFile类,我们可以实现文件的打开、读取、写入和关闭等操作,同时QFileInfo类则提供了获取文件属性的便捷方式。文章中提供的代码示例进一步展示了如何在实际的Qt应用程序中应用这些API,帮助开发者快速上手并解决文件操作中可能遇到的问题。
此外,文章还提到了Qt中的一些特殊文件操作类,如QTemporaryFile、QSaveFile、QSerialPort和QProcess等,这些类在特定场景下提供了额外的功能,增强了文件操作的灵活性和安全性。通过本文的学习,开发者不仅能够掌握Qt文件操作的基础,还能够根据不同的应用需求选择合适的工具和方法,提高开发效率和程序的健壮性。