Qt学习笔记之文件处理

淺唱寂寞╮ 提交于 2020-02-03 17:43:03

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指定的。

详见《Qt学习笔记之QTemporaryFile

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();

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!