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();
}
相关推荐
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超2 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int2 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
慧都小项2 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
CoderYanger2 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读2 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
CCCCCCCCharlie2 天前
Linux进程控制四大核心操作
linux·开发语言