目录
一、Qt 文件系统
Qt 作为一个通用开发库,提供了跨平台的文件操作能力。文件系统主要分为两大类:顺序访问设备和随机访问设备。
1.顺序访问设备
数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,比如:QProcess、QTcpSocket、QUdpSoctet和QSslSocket。
2.随机访问设备
可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针,比如:QFile、QTemporaryFile和QBuffer。
QIODevice是所有 I/O 设备类的父类。
二、读写文件
Qt默认支持utf-8编码格式。在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
1.通过文件对话框获取文件路径
QFileDialog fileDialog(this);
QString filePath= fileDialog.getOpenFileName(this,"选择文件","C://");
2.读取文件并展示内容
Qt内读取文件可以使用QIODevice下的readAll()、write()等方法,还可以通过使用QDataStream或者QTextStream两个类来实现。
- 简单说一下QDataStream和QTextStream的区别:
QTextStream 侧重于向QIODevice文本读写,这里所说的文本指的是普通的简单的QChar、QString、QLatin1Char、int等类型的文本。
QDataStream则是侧重于数据格式和类型,是基于QIODevice的二进制数据的序列化,QDataStream数据流不仅可以操作QTextStream所能处理的普通文本,而且可以对特定格式的类型数据进行序列化和反序列化,比如QBrush, QColor, QDateTime, QFont, QPixmap, QString, QVariant 等等。
一般来说,二进制用数据流 QDataStream、文本文件用文本流QTextStream。
注意:使用QDataStream写入文本的数据会乱码。读取数据时必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。
- 数据流
数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
使用QIODevice下的方法来进行文件的读写:
a.读取文件
//读取文件方法一:readAll
QFile file(filePath);
file.open(QIODevice::ReadOnly);
QByteArray array= file.readAll();
ui->textEdit->setText(array);
file.close();
//读取文件方法二:readLine
QFile file(filePath);
file.open(QIODevice::ReadOnly);
QByteArray array= file.readLine();
while(!file.atEnd())
{
array+= file.readLine();
}
b.展示内容
方法一:如果文件为utf-8编码
ui->textEdit->setText(array);//默认支持utf-8,如果文本是gbk则会乱码
方法二:如果文件为utf-8编码
QTextCodec* code=QTextCodec::codecForName("utf-8");//支持utf-8,如果文本是gbk则会乱码
ui->textEdit->setText(code->toUnicode(array));
方法三:如果文件为GBK编码
QTextCodec* code=QTextCodec::codecForName("gbk");//支持gbk,如果文本是utf-8则会乱码
ui->textEdit->setText(code->toUnicode(array));
方法四:如果文件为GBK编码
ui->textEdit->setText(QString::fromLocal8Bit(array));//支持gbk,如果文本是utf-8则会乱码
c.写入文件
方法一:文件编码为UTF-8
QFile file(filePath);
file.open(QIODevice::Append);
file.write(QString("这句话是写入的").toUtf8());//当文件格式为utf-8时,不会乱码
file.close();
方法一:文件编码为GBK
QFile file(filePath);
file.open(QIODevice::Append);
file.write(QString("这句话是写入的").toLocal8Bit());//当文件格式为gbk编码时,不会乱码
file.close();
三、获取文件信息
文件的相关信息,包括后缀、所在路径、文件名称、修改事件等信息的获取需要依赖QFileInfo来获得。
QFileInfo info(filePath);
qDebug()<<"后缀:"<<info.suffix()
<<"所在路径:"<<info.path()
<<"创作时间:"<<info.birthTime().toString("yyyy/MM/dd hh:mm:ss.zzz")
<<"修改时间:"<<info.lastModified().toString("yyyy/MM/dd hh:mm:ss.zzz");