第34课 - 缓冲区操作与目录操作(QBuffer、QDir和QFileSystemWatcher)

1、缓冲区操作 

Qt中缓冲区的概念 

    -缓冲区的本质为一段连续的存储空间 

    -QBuffer是Qt中缓冲区相关的类 

    -在Qt中可以将缓冲区看作一种特殊的IO设备

    -文件流辅助类可以直接用于操作缓冲区 

 

QBuffer缓冲区的使用方式 

 

QBuffe缓冲区的使用场合 

         1. 在线程间进行不同类型的数据传递 

         2. 缓存外部设备中的数据返回 

         3. 数据读取速度小于数据写入速度 

2、编程实验 

缓冲区操作   34-1.pro 

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

void write_buffer(int type, QBuffer& buffer)
{
    if( buffer.open(QIODevice::WriteOnly) )//打开IO设备(缓冲区)
    {
        QDataStream out(&buffer); //将辅助类对象关联到buffer对象

        out << type;

        if( type == 0 )
        {
            out << QString("PI");
            out << QString("3.1415");
        }
        else if( type == 1 )
        {
            out << 3;
            out << 1415;
        }
        else if( type == 2 )
        {
            out << 3.1415;
        }

        buffer.close(); //关闭IO设备
    }
}

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

3、目录操作 

QDir是Qt中功能强大的目录操作类

    -Qt中的目录分隔符统一使用'/'

    -QDir能够对目录进行任意操作(创建,删除,重命名) 

    -QDir能够获取指定目录中的所有条目(文件和文件夹) 

    -QDir能够使用过滤字符串获取指定条目 

    -QDir能够获取系统中的所有根目录 

目录操作基础示例 

4、编程实验 

目录操作示例   34-2.pro 

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

void test_dir()
{
    const char* PATH = "C:/Users/wss/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();   //为什么不用QStringList?

        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/wss/Desktop/QDir");

    return a.exec();
}

 

5、文件系统监视器 

QFileSystemWatcher用于监控文件和目录的状态变化

      -能够监控特定目录和文件的状态 

      -能够同时对多个目录和文件进行监控 

      -当目录或者文件发生改变时将触发信号 

      -可以通过信号与槽的机制捕捉信号并做出响应 

文件监控示例 

6、编程实验 

文件监控示例   34-3.pro 

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);//参数可以查阅Qt帮助
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/wss/Desktop/text.txt");
    watcher.addPath("C:/Users/wss/Desktop/QDir");
    
    return a.exec();
}

7、小结 

缓冲区的本质为一段连续的内存空间 

在Qt中可以将缓冲区看作一种特殊的IO设备 

QDir提供了强大的目录操作支持 

QFileSystemWatcher能够监控文件和目录的状态变化 

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81505902