第34课 缓冲区操作与目录操作

1、缓冲区操作

    1.1、 Qt中缓冲区的概念
        1.1.1、 缓冲区的本质为一段连续的存储空间
        1.1.2、 QBuffer是qt中缓冲区相关的类
        1.1.3、 在Qt中可以将缓冲区看做是一种特殊的IO设备
        1.1.4、 文件流辅助类(上节课那些)可以直接用于操作缓冲区

    1.2、 QBuffer的使用方式
                
              

    1.3、 QBuffer缓冲区的使用场合
        1.3.1、 线程间进行不同类型的数据传递(将不同类型数据写到缓冲区对象里,然后把对象传递过去
        1.3.2、 缓存外部设备中的数据返回
        1.3.3、 数据读取速度小于数据写入速度


#include <QtCore/QCoreApplication>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>
#include <QString>
#include <QIODevice>
//与文件一样都是IO操作,方式也类似
//1、文件需要QFile与一个实际文件相关联,缓冲区需要QBuffer与一片存储空间(QByteArray定义的)相关联
//2、文件的打开需要QFile的对象来打开,缓冲区的打开需要QBuffer的对象来打开。
//3、写入和读出数据一般都需要QFile(或QBuffer)对象与QDataStream(或QTextStream)相关联。
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.14");
        }
        else if(type == 1)
        {
            out << 35;
            out << 55;
        }
        else if(type == 2)
        {
            out << 3.15;
        }
        buffer.close();
    }
}
void read_buffer(QBuffer& buffer)
{
    int type;
    if(buffer.open(QIODevice::ReadOnly))
    {
        QDataStream in(&buffer);//关联
        in >> type;
        switch(type)
        {
            case 0:         //swich   case中不要有变量的定义。否则会报error:crosses initialization of .错误
        {
                QString s1;
                QString s2;
                in >> s1;
                in >> s2;
                qDebug() << s1;
                qDebug() << s2;
                break;
        }
            case 1:
        {
                int a = 0;
                int b = 0;
                in >> a;
                in >> b;
                qDebug() << a;
                qDebug() << b;
        }
                break;
            case 2:
        {
                double d = 0;
                in >> d;
                qDebug() << d;
                break;
        }
        default:
                break;
        }
    }
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QByteArray ba;
    QBuffer buffer(&ba);
    write_buffer(2, buffer);
    read_buffer(buffer);
    
    return a.exec();
}


2、目录操作

    2.1、 QDir是Qt中功能强大的目录操作类
        2.1.1、 Qt中的目录分隔符统一使用‘/’
        2.1.2、 QDir能够对目录进行任意操作(创建、删除、重命名)
        2.1.3、 QDir能够能够获取指定目录中的所有条目和路径等(文件和文件夹)
        2.1.4、 QDir能够使用过滤字符串获取指定条目
        2.1.5、 QDir能够获取系统中的所有根目录

    2.2、 目录操作基础实例
          



#include <QtCore/QCoreApplication>
#include <QDir>
#include <QStringList>
#include <QString>
#include <QDebug>
#include <QFileInfo>
#include <QFileInfoList>
void dir_test(QString path)
{
    QDir dir(path);
    if(!dir.exists())
    {
        dir.mkdir(path);
    }
    if(dir.exists())
    {
        dir.cd(path);
        QStringList list = dir.entryList();//获得目录文件列表
        for(int i=0; i<list.count(); i++)
        {
            qDebug() << list[i];
        }
    }
}
unsigned int countsize(QString path)//计算文件及文件夹大小
{
    unsigned int ret = 0;
    QFileInfo info(path);       //能够获得一些文件的信息
    if(info.isFile())
    {
        ret = info.size();
    }
    else if(info.isDir())
    {
        QDir dir(path);
        //dir.cd(path);
        QFileInfoList list = dir.entryInfoList();//为了后面能取到绝对路径属性,这里返回属性列表。
        for(int i=0; i<list.count(); i++)
        {
            if((list[i].fileName()!="..") && (list[i].fileName()!= ".."))
            {
                ret += countsize(list[i].absoluteFilePath());//递归调用文件夹、。
            }
        }
    }
    return ret;//返回当前文件夹下所有目录名字。
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    dir_test("I:/QT/34QBuffer/34-1");
    qDebug() << countsize("I:/QT/34QBuffer/34-1");
    
    return a.exec();
}


3、文件系统监视器
    3.1、 QFileSystemWatcher用于监控文件和目录的状态变化(内容、重命名、删除)
        3.1.1、 能够监控指定目录和文件的状态
        3.1.2、 能够同时对多个文件和目录进行监控
        3.1.3、 当目录或者文件发生改变时将触发信号
        3.1.4 、可以通过信号与槽的机制捕获信号并作出反应
            

.h头文件

#ifndef _WATCHER_H_
#define _WATCHER_H_
#include <QObject>
#include <QFileSystemWatcher>
#include <QString>
#include <QDebug>
class Watcher : public QObject
{
    Q_OBJECT
private:
    QFileSystemWatcher m_watcher;//等会添加需要监控的文件或者目录。
public:
    explicit Watcher(QObject* parent = 0);   //防止隐式类型的转换,接口是拿来实现的。
    void addpath(QString path);
signals:
public slots:
    void directorychanged(const QString&);    //槽函数,处理事件
    void filechanged111(const QString&);
};
#endif // WATCHER_H


.cpp实现文件


#include "Watcher.h"
Watcher::Watcher(QObject* parent) : QObject(parent)   //防止隐式类型的转换,接口是拿来实现的。
{
    //2、连接信号与槽
    connect(&m_watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(filechanged111(const QString&)));
    connect(&m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(directorychanged(const QString&)));
}
    //3、加入受监控的文件或者目录
void Watcher::addpath(QString path)
{
    m_watcher.addPath(path);
}
    //1、定义槽函数
void Watcher::directorychanged(const QString&)    //槽函数,处理事件
{
    qDebug() << "directorychanged";
}
void Watcher::filechanged111(const QString&)            //这里信号发生一次,槽函数执行两次???
{
    qDebug() << "filechanged111";
}


main.cpp实现文件


#include <QtCore/QCoreApplication>
#include "Watcher.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
    //Set  Encode
    QTextCodec::setCodecForTr(QTextCodec::codecForName("system"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("system"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("system"));
    QCoreApplication a(argc, argv);
    
    Watcher w;
    w.addpath("C:/Users/Administrator/Desktop/QT招聘的需求.txt");
    //w.addpath("C:/Users/Administrator/Desktop/IntelligentHealthcare");
    qDebug() << "配置识别中文成功\n";
    return a.exec();
}

4、小结

    4.1、 缓冲区的本质为一段连续的内存空间
    4.2、 在Qt中可以将缓冲区看做是一种特殊的IO设备
    4.3、 QDir提供了强大的目录操作支持
    4.4、 QFileSystemWatcher用于监控文件和目录的状态变化


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值