Qt——缓冲区操作与目录操作

1.QT中缓冲区的概念

  • 缓冲区本质是一段连续的存储空间

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

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

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

    #include
    #include
    #include
    #include
    #include

    void write_buffer(int type, QBuffer& buffer)
    {
    if( buffer.open(QIODevice::WriteOnly) )
    {
    QDataStream out(&buffer);
    out << type;
    if( type == 0 )
    {
    out << QString("Hello World");
    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(1, buffer);
      read_buffer(buffer);
      
      return QCoreApplication::exec();

    }

QByteArray、QBuffer、QDataStream三者之间的关系:

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

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

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

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

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

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

    void test_dir()
    {
    const char* PATH = "C:/QDir";
    QDir dir; // 创建 Qt 文件夹操作对象

    复制代码
      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];
          }
      }

    }

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

    复制代码
      test_dir();
    
      return QCoreApplication::exec();

    }

运行结果:

由于该文件夹是空的,所以返回该结果,"."表示当前目录;".."表示上一级目录

复制代码
//计算该目录下所有文件的大小
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;
}

3.文件系统监视器

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

  • 能够监控特定目录和文件的状态
  • 能够同时对多个目录和文件进行监控
  • 当目录或文件发生改变时将触发信号(文件内容发生改变、重命名、被删除)
  • 可以通过信号与槽的机制捕捉信号并做出响应

Watcher.h

复制代码
#ifndef WATCHER_H
#define WATCHER_H

#include <QObject>
#include <QFileSystemWatcher>

class Watcher : public QObject
{
    Q_OBJECT

    QFileSystemWatcher m_watcher; // Qt 自带的文件 / 文件夹监视器

private slots:
    void statusChanger(const QString& path);
public:
    explicit Watcher(QObject *parent = nullptr);
    void addPath(QString path); //addPath 就是给文件监视器 "报名"
};

#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(statusChanger(const QString&)));
    connect(&m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(statusChanger(const QString&)));
}

void Watcher::statusChanger(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:/QDir/1.txt");
    watcher.addPath("C:/QDir");

    return QCoreApplication::exec();
}
相关推荐
leisoo80972 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴3 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
一只旭宝4 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
coder!mq6 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding6 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ6 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大6 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS7 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
quantdash_cc7 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
ydd1001007 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言