Qt学习之路23--缓冲区QBuffer和目录QDir

版权声明:未经说明,禁止转载 https://blog.csdn.net/tqs_1220/article/details/82356154

缓冲区

  • 缓冲区的概念就是一段连续的存储空间
  • Qt中使用QBuffer类进行缓冲区相关操作
  • 在Qt中可以将缓冲区看做是一种特殊的IO设备
  • 文件流辅助类是针对IO设备的,可以像操作文件直接作用于缓冲区
  • 只要有数据的读写和存取都可能会用到缓冲区
  • 缓冲区的使用可以简化数据传递过程,读写数据都是一个缓冲区对象
    -如何使用:将缓冲区和文本流或数据流对象绑定,直接通过文件流对象操作缓冲区

缓冲区使用场合

  • 在线程间进行不同类型的数据传递
    • 在线程之间进行数据传递时选择缓冲区比较方便,因为缓冲区属于共享资源,所有线程都能进行访问,所以通过缓冲区往不同的线程中传递数据是十分便捷的。
  • 缓存外部设备的返回数据。
    • 由于外部设备返回的数据可以另作他用,所以需要接收保存,因为缓冲区可以被作为IO设备使用。
  • 数据读取速度小于数据写入速度的情况

代码实现

QByteArray array;
QBuffer buffer(&array);//将字节数组关联到缓冲区,就是这片空间就作为缓冲区
if(buffer.open(QIODevice::WriteOnly))
{
    QDataStream out(&buffer);//通过一个数据流对象可以在同一个缓冲区中操作任意类型数据
    out << QString("TQSong");//写入字符串时必须是qt里的QString字符串
    out << 3.1415926;
    buffer.close();
}
if(buffer.open(QIODevice::ReadOnly))
{
    QDataStream in(&buffer);
    QString str = "";
    double pi = 0.0;
    in >> str;
    in >> pi;
    qDebug() << str;
    qDebug() << pi;
    buffer.close();
}

这里写图片描述
该例子的精妙之处就在于仅仅一个字符数组可以通过数据流对象完成各种类型的数据操作,这也证明了缓冲区的便捷性,使用文件也可以实现同样的操作,但使用缓冲区不需要文件作为中间介质。

目录操作QDir

  • QDir是一个强大的目录操作类
  • Qt中的分隔符统一使用斜杠’/’描述
  • QDir能够对目录进行任意操作,比如创建、删除、重命名等。
  • QDir能够获取指定目录下的所有条目(文件和文件夹)。
  • QDir能够使用过滤zi字符串获取指定条目
  • QDir能够获取系统中的所有根目录

使用QDir获取某个目录下的所有条目

const char* PATH = "G:/D.T.Qt/Code";
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++)
    {
        qDebug() << list[i];
    }
}

这里写图片描述

通过QDir和QFileInfo求一个路径下所有文件的大小和

unsigned int calc_size(QString path)
{
    unsigned int ret = 0;
    QFileInfo info(path);//定义一个文件属性类对象
    if(info.isFile())//如果对应路径下是个文件直接求文件大小
    {
        ret = info.size();
    }
    else if(info.isDir())//如果为目录
    {
        QDir dir(path);//创建一个QDir对象
        QFileInfoList list = dir.entryInfoList();//此函数的返回值是一个QFileInfo的链表对象,包含当前目录下的所有文件和子目录。


        for(int i = 0; i < list.count(); i++)
        {
            if(list[i].fileName() != "." && list[i].fileName() != "..")/*在获取目录的条目时会将这两个字符串保留下来,所以需要排除*/
            {
                ret += calc_size(list[i].absoluteFilePath());//递归对每个绝对路径里的已存在文件大小进行相加
            }
        }
    }
    return ret;
}

通过递归不断深入到路径里层,直到遇到某个能直接求得大小的文件,将所有求得的结果相加后就是整个路径对应的大小。

在两个小例子中使用到QDir的一些常用简单函数,QDir还有比较多的操作,可以查看帮助文档,里面可以获取更加全面的内容。

文件系统监视器

  • QFileSystemWatcher用于监视文件系统中文件和目录的状态是否发生变化
  • 能够监控特定文件和目录的状态
  • 能够同时多多个目录和文件进行监控
  • 当目录和文件发生改变时将触发信号
  • 可以通过信号与槽的机制捕捉状态的变化并作出反应
  • 使用方法
    • 定义一个文件监视器对象
    • 通过addPath(const QString &file)函数添加需要监控的文件,通过removePath()函数清除文件监视器中的文件或目录
    • 自定义槽函数,并与文件系统监视器对象关联起来
    • 触发信号包括void 目录变化信号directoryChanged ( const QString & path )和文件变化信号void fileChanged ( const QString & path )
    • 最后就是修改文件产生触发信号后执行槽函数了。

小结

  • 缓冲区的本质就是一段连续存储的内存空间
  • Qt中将缓冲区看做是一种特殊的IO设备
  • QDir提供了大量的目录操作
  • QFileSystemWatcher类可以监控指定目录或文件的状态变化

猜你喜欢

转载自blog.csdn.net/tqs_1220/article/details/82356154
今日推荐