Qt中的文件操作

1.Qt中IO操作的处理方式
Qt通过统一的接口简化了文件与外部设备的操作方式
Qt中的文件被看做一种特殊的外部设备
Qt中的文件操作与外部设备的操作相同
2.IO操作中的关键函数接口
打开设备:bool open(OpenMode mode)
读取数据:QByteArray read(qint64 maxSize)
写入数据:qint64 write(const QByteArray& byteArray)
关闭设备:void close()
IO操作的本质:连续存储空间的数据读写
3.中的设备的类型
顺序存取设备:
只能从头开始顺序的读写数据,不能指定数据的读写位置
随机存取设备:
可以定位到任意的位置进行数据的读写(seek function)

Qt中IO设备的继承层次图:
在这里插入图片描述QFile是Qt中用于文件操作的类
QFile对象对应到计算机上的一个文件
在这里插入图片描述QFileInfo类用于读取文件属性信息:
在这里插入图片描述

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QByteArray>
#include <QDebug>
#include <QFileInfo>
#include <QDateTime>

void write(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        file.write("D.T.Software\n");
        file.write("Delphi Tang\n");
        file.close();
    }
}

void read(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        QByteArray ba = file.readLine();
        QString s(ba);

        qDebug() << s;

        file.close();
    }
}

void info(QString f)
{
    QFile file(f);
    QFileInfo info(file);

    qDebug() << info.exists();
    qDebug() << info.isFile();
    qDebug() << info.isReadable();
    qDebug() << info.isWritable();
    qDebug() << info.created();
    qDebug() << info.lastRead();
    qDebug() << info.lastModified();
    qDebug() << info.path();
    qDebug() << info.fileName();
    qDebug() << info.suffix();
    qDebug() << info.size();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    write("C:/Users/hp/Desktop/test.txt");
    read("C:/Users/hp/Desktop/test.txt");
    info("C:/Users/hp/Desktop/test.txt");
    
    return a.exec();
}

4.Qt中提供了临时文件操作类QTemporaryFile
安全地创建一个全局唯一的临时文件
当对象销毁时对应的临时文件将被删除
临时文件的打开方式为QIODevice::ReadWrite
临时文件常用于大数据传递或者进程间通信的场合

#include <QtCore/QCoreApplication>
#include <QTemporaryFile>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTemporaryFile tempFile;

    if( tempFile.open() )
    {
        tempFile.write("D.T.Software");
        tempFile.close();
    }

    QFileInfo info(tempFile);

    qDebug() << info.isFile();
    qDebug() << info.path();
    qDebug() << info.fileName();
    
    return a.exec();
}

5.文本流和数据流
Qt中将文件类型分为2大类:
文本文件:文件内容是可读的文本字符
数据文件:文件内容是直接的二进制数据

QFile直接支持文本文件和数据文件的读写:

qint64 read(char* data, qint64 maxSize)
QByteArray read(qint64 maxSize)
qint64 write(const char* data, qint64 maxSize)
qint64 write(const QByteAyyay& byteArray)

思考:如何将一个浮点数据写入文本文件和数据文件?

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("C:/Users/hp/Desktop/test.hex");

    if( file.open(QIODevice::WriteOnly) )
    {
        QString dt = "D.T.Software";
        double value = 3.14;

        file.write(dt.toStdString().c_str());
        file.write(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();
    }

    if( file.open(QIODevice::ReadOnly) )
    {
        QString dt = "";
        double value = 0;

        dt = QString(file.read(12));
        file.read(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();

        qDebug() << dt;
        qDebug() << value;
    }
    
    return a.exec();
}

简化操作如下:
Qt提供辅助类简化了文本文件/数据文件的读写
QTextStream:写入的数据全部转换为可读文本
QDataStream:写入的数据根据类型转换为二进制数据

IO设备辅助类的使用方式:
在这里插入图片描述不同Qt版本的数据流格式文件格式可能不同
void setVersion(int v) //设置读写版本号
int version() const //获取读写版本号
当数据流文件可能在不同版本的Qt程序间传递数据是=时,需要考虑版本的问题!

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDataStream>
#include <QDebug>

void text_stream_test(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        QTextStream out(&file);

        out << QString("D.T.Software") << endl;
        out << QString("Result: ") << endl;
        out << 5 << '*' << 6 << '=' << 5 * 6 << endl;

        file.close();
    }

    if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        QTextStream in(&file);

        while( !in.atEnd() )
        {
            QString line = in.readLine();

            qDebug() << line;
        }

        file.close();
    }
}

void data_stream_test(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly) )
    {
        QDataStream out(&file);

        out.setVersion(QDataStream::Qt_4_7);

        out << QString("D.T.Software");
        out << QString("Result: ");
        out << 3.14;

        file.close();
    }

    if( file.open(QIODevice::ReadOnly) )
    {
        QDataStream in(&file);
        QString dt = "";
        QString result = "";
        double value = 0;

        in.setVersion(QDataStream::Qt_4_7);

        in >> dt;
        in >> result;
        in >> value;

        file.close();

        qDebug() << dt;
        qDebug() << result;
        qDebug() << value;
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    text_stream_test("C:/Users/hp/Desktop/text.txt");
    data_stream_test("C:/Users/hp/Desktop/data.dat");
    
    return a.exec();
}

小结:
Qt中的文件辅助类用于方便读写操作
QTextStream用于文本数据的快速读写
QDataStream用于二进制数据的快速读写
QDataStream的文件格式与Qt版本相关

4.缓冲区操作与目录操作
Qt中缓冲区的概念:
缓冲区的本质为一段连续的存储空间
QBuffer是Qt中缓冲区相关的类
在Qt中可以将缓冲区看做一种特殊的IO设备
文件辅助类可以直接用于操作缓冲区

QBuffer缓冲区的使用方式:
在这里插入图片描述
QBuffer缓冲区的使用场合:
1.在线程间进行不同类型的数据传递
2.缓存外部设备中的数据返回
3.数据读取速度小于数据写入速度
编程实验:缓冲区操作

#include <QtCore/QCoreApplication>
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QDebug>

void write_buffer(int type, QBuffer& buffer)
{
    if( buffer.open(QIODevice::WriteOnly) )
    {
        QDataStream out(&buffer);

        out << type;

        if( type == 0 )
        {
            out << QString("D.T.Software");
            out << QString("3.1415");
        }
        else if( type == 1 )
        {
            out << 3;
            out << 1415;
        }
        else if( type == 2 )
        {
            out << 3.1415;
        }

        buffer.close();
    }
}

void read_buffer(QBuffer& buffer)
{
    if( buffer.open(QIODevice::ReadOnly) )
    {
        int type = -1;
        QDataStream in(&buffer);

        in >> type;

        if( type == 0 )
        {
            QString dt = "";
            QString pi = "";

            in >> dt;
            in >> pi;

            qDebug() << dt;
            qDebug() << pi;
        }
        else if( type == 1 )
        {
            int a = 0;
            int b = 0;

            in >> a;
            in >> b;

            qDebug() << a;
            qDebug() << b;
        }
        else if( type == 2 )
        {
            double pi = 0;

            in >> pi;

            qDebug() << pi;
        }

        buffer.close();
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QByteArray array;
    QBuffer buffer(&array);

    write_buffer(2, buffer);
    read_buffer(buffer);
    
    return a.exec();
}

QDir是Qt中功能强大的目录操作类:
Qt中的目录分隔符统一时可用’/’
QDir能够对目录进行任意操作(创建,删除,重命名)
QDir能够获取指定目录中的所有条目(文件和文件夹)
QDir能够使用过滤字符串获取指定条目
QDir能够获取系统中的所有根目录
目录操作基础实例:
在这里插入图片描述实验编程:目录操作实例

#include <QtCore/QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QFileInfoList>
#include <QDebug>

void test_dir()
{
    const char* PATH = "C:/Users/hp/Desktop/QDir";
    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.count(); 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.count(); i++)
        {
            if( (list[i].fileName() != ".") && (list[i].fileName() != "..") )
            {
                ret += calculate_size(list[i].absoluteFilePath());
            }
        }
    }

    return ret;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    test_dir();

    qDebug() << calculate_size("C:/Users/hp/Desktop/QDir");
    
    return a.exec();
}

文件系统监视器:
能够监视特定目录和文件的状态
能够同时对多个目录和文件进行监控
当目录或者文件发生改变时将触发信号
可以通过信号与槽的机制捕捉信号并做出响应

文件监视实例:

在这里插入图片描述6.文本编辑器中的数据读取
QAction被点击之后会产生一个triggered信号
通过信号与槽的机制能够捕捉对QAction对象的操作
项目中可以将多个信号映射到同一个槽函数

connect(action,
				SIGNAL(triggered()),
				this,
				SLOT(slot)function()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值