目录
前言
关于文件相关操作,之前也学习过很多:
- C语言中
fopen 打开文件
fread fwrite 读写文件
fclose 关闭文件 - C++中
fstream 打开文件
<< >> 读写文件
close 关闭文件 - Linux中
open 打开文件
read write 读写文件
close 关闭文件
Qt 也提供了一套文件操作
Qt 中使用上述的几种方案来读写文件,也是完全可以的(Linux 这一套,局限于 Linux 系统,Windows 上的 Qt,就需要使用 Windows api)
但是即使如此,Qt 还是又封装了一套,原因就是:
Qt 诞生的太早了,当时 C++ 还没有"标准化"概念
所以咱们在编写 Qt 程序的时候,更推荐使用 Qt 自己提供的这一套文件操作,和 QString 等 Qt 内置的类可以很好的配合
Qt中的文件操作,核心操作也是这几个部分,打开、读、写、关闭
是通过 QFile 类,完成上述文件操作的
从下图可以看到,QFile 继承自 QFileDevice,QFileDevice 继承自 QIODevice:

- QTemporaryFile:是 QFile 的子类 ,表示临时用一下,这个对象销毁,对应的文件就自动删除了
- QSaveFile:要写入大量的数据,写文件的时候,往往会把旧的文件先清空再写,万一新的数据写一半,结果出错了,新的数据用不了旧的数据也无了
所以通过 QSaveFile 类,如果你要想写一个文件,会自动的把内容先写到临时文件里(不会破坏原有的文件),等到所有内容都写完了之后,再把旧文件自动删掉,并且用新的文件替换旧的文件
这种策略是一个广泛的策略 - QTcpSocket、QUdpSocket:通过 Qt 进行简单的网络编程
- QSerialPort:对串口进行读写操作,串口是一种比较古老的通信方式,一般是在嵌入式系统上
- QBluetoothSocket:进行蓝牙通信
- QProcess:进行进程间通信,相当于是对 fork/exec 操作进行的封装,
- QBuffer:是 Qt 内置的缓冲区类
QFile的使用
- 打开 open
- 读 read / readLine /readAll
- 写 write
- 关闭 close
QFile 构造时,需要提供文件的路径:
可以使用绝对路径,也可以使用相对路径

open
下面两个 open 的重载函数,一个是从 FILE* 中打开,另一个是针对文件描述符打开,使用下面两种函数,还需要搭配C语言或系统原生API去打开,是比较麻烦的

所以更常用的是下面的 open 重载函数,直接可以按照前面指定的路径打开:

构造函数中,指定了路径之后,此时直接通过这个版本的 open 打开即可
OpenMode 打开方式,有下面三种:
- 读方式
- 写方式
- 追加写方式
read / readAll / readLine
下面两个 read 的重载函数,区别就是通过参数 data 返回,还是通过返回值 QByteArray 返回:

readAll 就是一次性读取所有的数据

readLine 一次读取一行,也是一样的效果

- QByteArray 就是 Qt 针对字节数组进行的封装
- QByteArray 很方便的转成 QString
write
write 也有好几个版本:
可以指定字符数组,也可以指定 QByteArray

close
关闭本质上是要释放文件描述符表中的表项,文件描述符表存在上限
如果一直打开,不关闭的话,就可能会使文件描述符表被占满,后续再尝试打开,就打开不了了

使用示例
下面使用代码演示 Qt 的文件操作
在构造函数中创建菜单,在中心创建一个多行输入框:

效果为:

接着给上面的两个菜单项 connect 槽函数:

打开 的槽函数实现如下:

保存 的槽函数实现如下:

运行程序,输入一段文本后,点击保存,就会有下面的这个页面弹出,我们输入文件名为 hello.txt:

打开刚刚路径下的 hello.txt,就有我们输入的内容:

如果我们手动将 hello.txt 文件内容改变,接着点击打开文件,就会在 多行输入框 中显示内容了:

QFileInfo的使用
类似于这样的功能,在C/C++ 标准库中本来都是没有的,所以要想使用类似的功能往往要使用系统 api
在 C++17 才引入了模块 filesystem
OFilelnfo 是 Qt提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等,QFileInfo类中提供了很多的方法,常用的有:
- isDir():检查该文件是否是目录
- isExecutable():检查该文件是否是可执行文件
- fileName():获得文件名
- completeBaseName():获取完整的文件名
- suffix():获取文件后缀名
- completeSuffix():获取完整的文件后缀
- size():获取文件大小
- isFile():判断是否为文件
- fileTime():获取文件创建时间、修改时间、最近访问时间等;
图形化界面的方式创建一个按钮,并右键转到槽,选择 clicked 信号:

槽函数实现如下:

运行程序:

点击弹出对话框按钮:

选择 ui_widget.h,就会打印相关属性:

Qt:文件学习到此结束