码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-17 21:04:09      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

1. 缓冲区操作

(1)Qt中缓冲区的概念

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

  ②QBuffer是Qt是缓冲区相关的类

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

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

(2)QBuffer缓冲区的使用方式

QByteArray array;
QBuffer buffer(&array);//缓冲区操作类

if (buffer.open(QIODevice::WriteOnly))
{
    QDataStream out(&buffer); //文件辅助类可以用于操作缓冲区
    
    out << QString("SantaClaus");
    out << 3.14;
    
    buffer.close();
}

(3)QBuffer缓冲区的使用场合

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

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

  ③数据读取速度小于数据写入速度(也可以是当读、写入速度不相等时)

【编程实验】缓冲区操作

#include <QCoreApplication>
#include <QBuffer>
#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("SantaClaus");
            out << QString("3.14159");
        }
        else if( type==1 )
        {
            out << 3;
            out << 14159;
        }
        else if ( type == 2 )
        {
            out << 3.14159;
        }

        buffer.close();
    }
}

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

        in >> type;

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

            in >> name;
            in >> pi;

            qDebug() << name;
            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);//将array作为缓冲区

    QBuffer buffer;//内建缓冲区

    write_buffer(0, buffer); //write_buffer(1, buffer);

    read_buffer(buffer);

    return a.exec();
}

2. 目录操作

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

  ①Qt中的目录分隔统一使用‘/‘

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

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

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

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

(2)目录操作基础示例

const char* PATH = "C:/Users/SantaClaus/Desktop/QDir"; //须以‘/‘分隔
QDir dir;

if (!dir.exists(PATH))
{
    dir.mkdir(PATH);
}

if (dir.exists(PATH))
{
    dir.cd(PATH); //进入PATH目录
    
    QStringList list = dir.entryList();
    
    for (int i=0; i<list.count(); ++i)
    {
        /*目录操作*/
    }
}

【编程实验】目录操作示例

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

//列出指定目录下的所有文件和文件夹
void test_dir(QString path)
{
    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);

    const char* PATH = "C:/Users/SantaClaus/Desktop/QDir";

    test_dir(PATH);

    qDebug() << calculate_size(PATH);

    return a.exec();
}

3. 文件系统监视器

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

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

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

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

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

(2)文件监控示例

//1.定义槽函数,监控状态变化
void Watcher::statusChanged(const QString& path)
{
    /*当状态发生变化时的一些操作*/
}

//2.连接状态信号到槽函数
Watcher::Watcher(QObject* parent):QObject(parent)
{
    //文件状态变化
    connect(&m_watcher, SIGNAL(fileChanged(const QString&)),...);
    //目录状态发生变化
    connect(&m_watcher, SIGNAL(fileChanged(const QString&)),...);
}

//3.加入受监控的文件或目录
void Watcher::addPath(QString path)
{
    m_watcher::addPath(path);
}

【编程实验】文件监控示例

//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 <QCoreApplication>
#include "Watcher.h"

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

    watcher.addPath("C:/Users/SantaClaus/Desktop/text.txt");
    watcher.addPath("C:/Users/SantaClaus/Desktop/QDir");

    return a.exec();
}

4. 小结

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

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

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

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

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

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5781459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!