作者前言
🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂
简述
⽂件操作是应⽤程序必不可少的部分。Qt 作为⼀个通⽤开发库,提供了跨平台的⽂件操作能⼒。 Qt提供了很多关于⽂件的类,通过这些类能够对⽂件系统进⾏操作,如⽂件读写、⽂件信息获取、⽂件复制或重命名等。
前面我们学习过C语言的fopen、fread、fwirte、fclose,
c++中有fstream、 >>、<<、close等
Linux有open 、read、 write
而Qt也有一套自己的文件操作,是基于读写的操作
在 Qt 中,⽂件读写的类为 QFile 。QFile 的⽗类为 QFileDevice ,QFileDevice 提供了⽂件交互操作的底层功能。 QFileDevice 的⽗类是 QIODevice,QIODevice 的⽗类为 QObject 。
如图:
上图中各类的说明如下:
• QFile 是⽤于⽂件操作和⽂件数据读写的类,使⽤ QFile 可以读写任意格式的⽂件。
• QSaveFile 是⽤于安全保存⽂件的类。使⽤ QSaveFile 保存⽂件时,它会先把数据写⼊⼀个临时⽂件,成功提交后才将数据写⼊最终的⽂件。如果保存过程中出现错误,临时⽂件⾥的数据不会被写⼊最终⽂件,这样就能确保最终⽂件中不会丢失数据或被写⼊部分数据。 在保存⽐较⼤的⽂件或复杂格式的⽂件时可以使⽤这个类,例如从⽹络上下载⽂件等。
• QTemporaryFile 是⽤于创建临时⽂件的类。使⽤函数 QTemporaryFile::open() 就能创建⼀个⽂件
名唯⼀的临时⽂件,在 QTemporaryFile 对象被删除时,临时⽂件被⾃动删除。
• QTcpSocket 和 QUdpSocket 是分别实现了 TCP 和 UDP 的类。
• QSerialPort 是实现了串⼝通信的类,通过这个类可以实现计算机与串⼝设备的通信。
• QBluetoothSocket 是⽤于蓝⽛通信的类。⼿机和平板计算机等移动设备有蓝⽛通信模块,笔记本
电脑⼀般也有蓝⽛通信模块。通过QBluetoothSocket类,就可以编写蓝⽛通信程。如编程实现笔
记本电脑与⼿机的蓝⽛通信。
• QProcess 类⽤于启动外部程序,并且可以给程序传递参数。
• QBuffer 以⼀个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作⼀个 I/O 设备来读写
File类
文件的操作基本就是 打开文件, 读取文件, 写入文件, 关闭文件,
下面一一介绍一下
打开文件
需要使⽤ open()函数 打开该设备,⽽且必须指定正确的打开模式,
如图:
这里虽然有两个现成的open函数,但是这两个函数在第一个参数都需要指定一个文件路径或许文件描述符,很不方便,一般情况下是使用下面这个open来进行的
我们只需对这个参数进行写入就可以了。
QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义的,在这个枚举类型中有枚举常量有如下:
读操作
当我们打开文件的时候,就要进行一些相关操作,而读操作就是这些操作之一,前面我们学习C语言和c++的时候就会知道, 一个文件以读方式进行打开,我们就需要读取一些我们需要的数据,在QT中,也有相关的读取数据的函数,这些读操作函数是继承于父类的父类(OpenMode)的成员函数,如图下:
下面演示一部分代码
//创建一个文件对话框
QString path = QFileDialog::getOpenFileName(this, name,"./");
qDebug()<< path;
//把文件路劲显示到状态栏中
status->showMessage(path);
//接下来打开对应的文件
QFile* file = new QFile(path);
//只读方式打开,判断文件是否真正的打开
if(!file->open(QIODevice::ReadOnly))
{
qDebug()<< "打开失败";
return;
}
//操作写入
edit->setText(file->readAll());
//关闭文件
file->close();
效果图如下:
写操作
当我们打开文件的时候,就要进行一些相关操作,而写操作就是这些操作之一,前面我们学习C语言和c++的时候就会知道, 一个文件以写方式进行打开,我们就需要读取一些我们需要的数据,在QT中,也有相关的写入数据的函数,这些写操作函数是继承于父类的父类(OpenMode)的成员函数,如图下:
//保存
//创建一个文件保存对话框
QString path = QFileDialog::getSaveFileName(this,name, "./");
qDebug()<< path;
QFile *file = new QFile(path);
if(!file->open(QIODevice::WriteOnly))
{
qDebug()<< "打开失败";
return;
}
//写入文件
//先获取到对应的文本
file->write(edit->toPlainText().toUtf8());
//关闭文件
file->close();
效果图这里就不演示了,
关闭操作
关闭的本质就是释放文件描述符表的表项, 因为文件描述符表存在上限,如果一直打开,不关闭就会被站满,后面尝试打开,就会打不开
关于读写操作的代码在前面了
⽂件和⽬录信息类
QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件⼤⼩、⽂件修改⽇期
等。QFileInfo类中提供了很多的⽅法,常⽤的有:
• isDir() 检查该⽂件是否是⽬录;
• isExecutable() 检查该⽂件是否是可执⾏⽂件;
• fileName() 获得⽂件名;
• completeBaseName() 获取完整的⽂件名;
• suffix() 获取⽂件后缀名;
• completeSuffix() 获取完整的⽂件后缀;
• size() 获取⽂件⼤⼩;
• isFile() 判断是否为⽂件;
• fileTime() 获取⽂件创建时间、修改时间、最近访问时间等;
这个功能在之前的C以及C++是没有的,如果要获取对应文件的相关信息需要使用到对应的系统的api接口, 但是在C++17中引入了filesystem
下面我们写一个Qt的示例来演示
void Myfile::Fileinfo(const QString &path)
{
//创建一个QFileinfo对象
QFileInfo* fileinfo = new QFileInfo(path);
if(fileinfo->isDir())
qDebug()<< "目录:"<<fileinfo->fileName();
else
qDebug()<< "文件:"<<fileinfo->fileName();
if(fileinfo->isExecutable())
qDebug()<< "是否可执行"<<"yes";
else
qDebug()<< "是否可执行"<<"no";
qDebug()<< "后缀名:"<<fileinfo->suffix();
qDebug()<< "文件大小:"<<fileinfo->size();
qDebug()<< "文件修改时间:"<<fileinfo->fileTime(QFile::FileModificationTime).toString();
}
效果图: