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();
}
相关推荐
大不点wow1 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm
阿里嘎多学长1 小时前
2026-07-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管
噢,我明白了1 小时前
Java中日期和字符串的处理
java·开发语言·日期
爱刷碗的苏泓舒1 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言
-银雾鸢尾-1 小时前
C#中的泛型约束
开发语言·c#
雪碧透心凉_2 小时前
while 循环与循环嵌套
开发语言·python
乐观勇敢坚强的老彭2 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
这就是佬们吗2 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
asdzx672 小时前
Python PDF 拆分实战指南:单页拆分与按需页码范围拆分
开发语言·python·pdf
孬甭_2 小时前
C++ vector
开发语言·c++