概述:
文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台 的文件操作能力。Qt 通过 QIODevice 提供了对 I/O 设备的抽象,这些设备具有 读写字节块的能力。下面是 I/O设备得类图(Qt5):
1,QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
2,QFileDevice:Qt5 新增加的类,提供了有关文件操作的通用实现。
3,QFlie:访问本地文件或者嵌入资源;
4,QTemporaryFile:创建和访问本地文件系统的临时文件;
5,QBuffer:读写 QbyteArray, 内存文件;
6,QProcess:运行外部程序,处理进程间通讯;
7,QAbstractSocket:所有套接字类的父类;
8,QTcpSocket:TCP 协议网络数据传输;
9,QUdpSocket:传输 UDP 报文;
10,QSslSocket:使用 SSL/TLS 传输数据;
文件系统分类:
顺序访问设备:
是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess
、QTcpSocket
、QUdpSoctet
和 QSslSocket
是顺序访问设备。
随机访问设备:
可以访问任意位置任意次数,还可以使用 QIODevice::seek()
函数来重新定位文件访问位置指针,QFile
、QTemporaryFile
和 QBuffer
是随机访问设备.
使用QFile来读文件
QFile
提供了从文件中读取和写入数据的能力。 我们通常会将文件路径作为参数传给 QFile
的构造函数。不过也可以在创建好 对象最后,使用 setFileName
()来修改,如下:
/*获取要打开的文件路径*/
QString path = QFileDialog::getOpenFileName(this,"open","../","source(*.cpp) ");
/*创建QFile对象并且将文件路径传给此对象*/
QFile file(path);
打开一个文件:
QString path = QFileDialog::getOpenFileName(this,"open","../","source(*.cpp) ");
if(path.isEmpty() == false)
{
//文件对象
QFile file(path);
//打开文件 只读方式
if(file.open(QIODevice::ReadOnly) == true)
{
/*直接读取全部,默认是utf8编码*/
#if 0
//读文件 默认识别utf8编码
QByteArray array = file.readAll();
ui->textEdit->setText(QString(array));
//
#endif
/*每次读一行,并且加到字符数组*/
QByteArray array;
while(file.atEnd() == false)
{
array += file.readLine();
}
}
/*关闭文件*/
file.close();
}
使用QFile保存文件:
/*获取保存路径*/
QString path = QFileDialog::getSaveFileName(this,"save","../","souce(*.cpp)");
if(path.isEmpty() == false)
{
QFile file;
file.setFileName(path);
//打开文件 只写方式
if(file.open(QIODevice::WriteOnly) == true)
{
/*服务文本编辑区的文本信息*/
QString str = ui->textEdit->toPlainText();
//QString -> String -> char*
/*转换为字符 C++固定,默认utf8*/
// file.write(str.toStdString().data());
file.write(str.toLocal8Bit());
/*QString -> QByteArray*/
QByteArray test;
QString str2 = "tets";
test = str2.toUtf8();//中文
test = str2.toLocal8Bit();/*本地编码*/
/*QByteArray -> char **/
char *a = test.data();
/*char* -> QString*/
char *p = "123";
QString c = QString(p);
}
file.close();
}
关于写文件的时候类型转换注意事项:
1,将QString转换为utf8
file.write(str.toUtf8());
2,将QString转换为char*
/*QString -> String -> char**/
file.write(str.toStdString().data());
3,QString转为字节数组
QByteArray test;
QString str2 = "tets";
test = str2.toUtf8();//中文
test = str2.toLocal8Bit();/*本地编码*/
4,字节数组转为char*
char *a = test.data();
5,char*转为QString
char *p = "123";
QString c = QString(p);
使用QFileInfo
获取文件信息
对于文件信息的获取,比如文件绝对路经,创建时间,以及文件后缀等采用QFileInfo
类来获取,比如:
QFileInfo info(path);
qDebug() << "文件名字:"<<info.fileName().toUtf8().data();
qDebug() << "文件后缀:"<<info.suffix();
qDebug() << "文件大小:"<< info.size()/1024 << "KB";
qDebug() << "文件创建时间"<< info.created().toString("yyyy-MM-dd hh:mm:ss");
注意:
对于文件名字默认是utf8需要转换成char*所以使用上述转换方法,
对于QDateTime
显示要想显示成为"2020-12-27 11:11:11:",需要转换成呢个QString并填写转换格式。