目录
一、概述
文件操作是应用程序必不可少的部分。Qt作为一一个通用开发库,提供了跨平台的文件操作能力。Qt提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。
在Qt中,文件读写的类为QFile。QFile 的父类为QFileDevice,QFileDevice 提供了文件交互操作的底层功能。QFileDevice 的父类是QIODevice, QIODevice 的父类为QObject。
QlODevice是Qt中所有输入输出设备(input/output device,简称I/O设备)的基础类, I/0 设备就是能进行数据输入和输出的设备,例如文件是一种I/0设备,网络通信中的socket是I/0设备,串口、蓝牙等通信接口也是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()函数打开该设备,而且必须指定正确的打开模式,QlODevice 中所有的打开模式由QlODevice::OpenMode枚举变量定义,其取值如下:
实例
实现一个简单的记事本,可以查看文件内容,可以保存新的文件
使用之前我们学习过的菜单栏与状态栏,以及一个文本控件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMenu>
#include<QMenuBar>
#include<QAction>
#include<QPlainTextEdit>
#include<QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//获取菜单栏
QMenuBar* menuBar = this->menuBar();
//添加菜单
QMenu* menu = new QMenu("文件");
menuBar->addMenu(menu);
//添加菜单栏选项
QAction* action_1 = new QAction("打开");
QAction* action_2 = new QAction("保存");
menu->addAction(action_1);
menu->addAction(action_2);
//输入框
edit = new QPlainTextEdit();
this->setCentralWidget(edit);
QFont font;
font.setPixelSize(20);
edit->setFont(font);
//连接QAction的信号槽
connect(action_1,&QAction::triggered,this,&MainWindow::handleAction1);
connect(action_2,&QAction::triggered,this,&MainWindow::handleAction2);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handleAction1()
{
//打开文件,弹出打开文件对话框
QString path = QFileDialog::getOpenFileName(this);
//把文件名显示到状态栏中
QStatusBar* status = this->statusBar();
status->showMessage(path);
//根据路径构造QFile对象
QFile file(path);
bool result = file.open(QIODevice::ReadOnly);
if(result==false)
{
status->showMessage(path + "打开失败");
return;
}
//读取文件
QString text = file.readAll();
//关闭文件
file.close();
//读到的内容显示到输入框
edit->setPlainText(text);
}
void MainWindow::handleAction2()
{
//弹出保存文件对话框
QString path = QFileDialog::getSaveFileName();
//在状态栏中显示这个文件名
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
//根据选择的路径,构造一个QFile对象,打开文件
QFile file(path);
bool result = file.open(QFile::WriteOnly);
if(!result)
{
statusBar->showMessage("打开文件失败");
return;
}
//写文件
const QString& text = edit->toPlainText();
file.write(text.toUtf8());
file.close();
}
实现效果
三、文件和目录信息
QFileInfo是Qt提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo类中提供了很多的方法,常用的有:
- isDir()检查该文件是否是目录;
- isExecutable()检查该文件是否是可执行文件;
- fileName()获得文件名;
- completeBaseName()获取完整的文件名;
- suffix()获取文件后缀名;
- completeSuffix()获取完整的文件后缀;
- size()获取文件大小;
- isFile()判断是否为文件;
- fileTime()获取文件创建时间、修改时间、最近访问时间等;
实例
在ui中添加一个pushbutton,实现对应的槽函数,弹出对话框,选择文件,则可以输出文件对应的信息
void Widget::on_pushButton_clicked()
{
//弹出对话框,获取文件路径
QString path = QFileDialog::getOpenFileName(this);
//构造QFileInfo对象
QFileInfo fileInfo(path);
//打印文件相关属性
qDebug()<<fileInfo.fileName();
qDebug()<<fileInfo.suffix();
qDebug()<<fileInfo.size();
}