Qt 34 缓冲区操作与目录操作以及文件系统监控,QBuffer,QDir,QFileSystemWatcher

本文介绍了使用Qt库中的QBuffer进行数据缓冲操作,如何通过QDir管理文件和目录,并展示了QFileSystemWatcher在监控文件系统变化的应用。实验涵盖了不同类型数据的缓冲处理和目录操作,提升工程效率。

学习自唐佐林老师Qt


总结:

QBuffer缓冲区类使用

QDir 目录类使用

QFileSystemWatcher:
文件系统变化监控类,用于监控目录,文件是否发生变化

在这里插入图片描述在这里插入图片描述在这里插入图片描述

实验1 缓冲区的用法:

#include <QtCore/QCoreApplication>
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QDebug>
void write_buffer(int type, QBuffer& buffer)
{
    //以二进制方式打开缓冲区 只写
    if( buffer.open(QIODevice::WriteOnly) )
    {
        //创建辅助类对象out,并关联到buffer
        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();
}

缓冲区的作用:
在实际工程项目里面,用到缓冲区必然涉及到数据的读写,而读写的数据,他的类型可能不同,个数也可能不同。如果不使用缓冲区,那么传递数据的过程会非常复杂的,使用缓冲区之后,就可以将这些不同类型,不同个数的参数全部写到缓冲区里面去,到最后 传递的只有一个缓冲区对象,这样就可以简化数据的传递过程。写的是一个缓冲区对象,读的也是一个缓冲区对象,传递的只有一个缓冲区对象。

在这里插入图片描述
在这里插入图片描述
实验2 :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];//QStringList中重载了数组操作符,所以可以使用数组操作符
        }
    }
}
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();
}

在这里插入图片描述
在这里插入图片描述
实验3:QFileSystemWatcher 使用

Watcher.h

#ifndef _WATCHER_H_
#define _WATCHER_H_
#include <QObject>
#include <QFileSystemWatcher>
class Watcher : public QObject
{
    Q_OBJECT
    QFileSystemWatcher m_watcher;
private slots:
    void statusChanged(const QString& path);//槽
public:
    explicit Watcher(QObject *parent = 0);
    void addPath(QString path);
};
#endif // WATCHER_H

Watcher.cpp

#include "Watcher.h"
#include <QDebug>
Watcher::Watcher(QObject *parent) : QObject(parent)
{
    connect(&m_watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(statusChanged(const QString&)));
    connect(&m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(statusChanged(const QString&)));
}
void Watcher::statusChanged(const QString &path)
{
    qDebug() << path << "is changed!";
}
void Watcher::addPath(QString path)
{
    m_watcher.addPath(path);
}

main.cpp

#include <QtCore/QCoreApplication>
#include "Watcher.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Watcher watcher;
    watcher.addPath("C:/Users/hp/Desktop/text.txt");
    watcher.addPath("C:/Users/hp/Desktop/QDir");
    
    return a.exec();
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值