Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储。对文件信息和目录进行操作的类是QfileIno,QDir和QDirIterator。要监视文件和目录变化,则可以使用QFi了SystemWatcher类。
1. 文件处理类QFile
QFile类提供了一个从文件中读取和写入文件的接口。
QFile是一个用于读写文本、二进制文件和资源的I/O设备。QFile可以单独使用,或者更方便地与QTextStream或QDataStream一起使用。
文件名通常在构造函数中传递,但是可以在任何时候使用setFileName()设置它。无论操作系统如何,QFile都期望文件分隔符为'/'。不支持使用其他分隔符(例如“\”)。
可以使用exists()检查文件是否存在,并使用remove()删除文件。(QFileInfo和QDir提供了更高级的文件系统相关操作。)
用open()打开文件,用close()关闭文件,用flush()刷新文件。
通常使用QDataStream或QTextStream读取和写入数据,但是也可以调用qiodevice继承的函数read()、readLine()、readAll()和write()。QFile还继承了getChar()、putChar()和ungetChar(),它们一次处理一个字符。
文件的大小由size()返回。您可以使用pos()获取当前文件位置,或者使用seek()移动到新的文件位置。如果已经到达文件的末尾,atEnd()返回true。
1.1 读写文本文件
1.1.1 通过QIODevice来读写文件
#include <QCoreApplication>
#include <QChar>
#include <QString>
#include <QDebug>
#include <QFile>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("E:/work/qe/mytest1/file.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug("can not open file ");
exit(0);
}
while (!file.atEnd()) {
QByteArray line = file.readLine();
qDebug("%s",line.data());
}
return a.exec();
}
1.1.2 通过QTextStream读写文本
#include <QCoreApplication>
#include <QChar>
#include <QString>
#include <QDebug>
#include <QFile>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("E:/work/qe/mytest1/file.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug("can not open file ");
exit(0);
}
QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull()) {
qDebug("%s",line.toLatin1().data());
line = in.readLine();
}
return a.exec();
}
1.2 操作二进制文件
QDataStream类提供了将二进制文件串行化的功能。QDataStream实现了C++的基本类型的串行化,如char,short,int,char*等。
#include <QCoreApplication>
#include <QChar>
#include <QString>
#include <QDebug>
#include <QFile>
#include <QDataStream>
#include <QTextStream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//! 二进制文件
QFile fileBin("E:/work/qe/mytest1/file1.dat");
fileBin.open(QIODevice::WriteOnly);
QDataStream out(&fileBin);
//! 文本文件
QFile file("E:/work/qe/mytest1/file.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug("can not open file ");
exit(0);
}
QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull()) {
qDebug("%s",line.toLatin1().data());
line = in.readLine();
out<<line;
}
file.close();
fileBin.close();
return a.exec();
}
1.3 临时文件
QTemporaryFile可以安全创建一个独一无二的临时文件,临时文件可以用open()来创建,Qt可以保证临时文件名不会重复。在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后还可以再打开。只要临时文件对象还没有销毁,临时文件就一直存在并由QTemporaryFile内部保持打开。
系列临时文件可以通过QDir::tempPath()来获取。在linux系统上临时目录通过是tmp,在Windows上则是由环境变量TEMP或TMP指定的。
2. 目录操作
QDir类具有存取目录结构和内容能力。使用QDir可以操作和存取目录或文件信息、操作底层文件系统,而且可以存取Qt的资源文件。
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
void test_dir()
{
const char* PATH = "G:/ggg";
QDir dir;
if( !dir.exists(PATH) ) //判断电脑里是否这个目录
{
dir.mkdir(PATH); //创建问价目录
}
if( dir.exists(PATH) )
{
dir.cd(PATH);
QStringList list = dir.entryList();
for( int i = 0; i < list.length(); i++ ) //打印目录文件
{
qDebug() << list[i];
}
}
}
unsigned int calculate_size(QString path) //计算目录文件的大小
{
QFileInfo info(path);
unsigned int ret = 0;
if( info.isFile() )
{
ret = info.size();
}
else if( info.isDir() )
{
QDir dir(path);
QFileInfoList list = dir.entryInfoList();
for( int i = 0; i < list.length(); i++ )
{
qDebug()<<list[i].fileName();
if(list[i].fileName() !="." && list[i].fileName() != "..")
{
ret = ret + calculate_size(list[i].absoluteFilePath());
}
}
}
return ret;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
test_dir();
qDebug() << calculate_size("F:/论文");
return a.exec();
}
参考资料:
1. QT基础:40---文本文件的读写(QFile、QTextStream)
2. QT基础:42---文件目录操作(QCoreApplication、QFile、QFileInfo、QDir、QTemporaryDir/File、QFileSystemWatcher)