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

1.QT中缓冲区的概念

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

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

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

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

    #include <QCoreApplication>
    #include <QBuffer>
    #include <QByteArray>
    #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("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();
}
相关推荐
AIGC设计所1 小时前
网络安全SRC漏洞挖掘学习路线 - 第四期:常见漏洞挖掘实操,实现首次挖洞突破
开发语言·网络·学习·安全·web安全
就叫飞六吧1 小时前
在线考试翻页抓取题目导出js
开发语言·前端·javascript
neo33011 小时前
debian13 编译源码qt5.15.18
开发语言·qt
Xiu Yan2 小时前
Java 转 C++ 系列:STL常用函数
java·开发语言·c++·stl·visual studio
**蓝桉**2 小时前
负载均衡概述
开发语言·阿里云·云计算·负载均衡
:1212 小时前
java面试基础
java·开发语言
代码羊羊2 小时前
Rust泛型编程:从零成本抽象到极致性能
开发语言·windows·rust
小樱花的樱花2 小时前
Linux Shell命令入门
linux·服务器·开发语言
沫璃染墨2 小时前
C++ std::list 深度解析:迭代器、splice 核心接口与排序效率全解
开发语言·c++