Qt 第34课、缓冲区操作与目录操作
创始人
2025-05-29 05:00:39

1、缓冲区操作

  • Qt 中缓冲区的概念
    — 缓冲区的本质为一段连续的存储空间(字节数组代表连续存储空间)
    — QBuffer 是 Qt 中缓冲区相关的类
    — 在 Qt 中可以将缓冲区看做一种特殊的 IO 设备
    — 文件流辅助类可以直接用于操作 缓冲区
  • QBuffer 缓冲区的使用方式
    在这里插入图片描述
  • QBuffer 缓冲区的使用场合
    1、在线程间进行不同类型的数据传递
    2、缓存外部设备中的数据返回
    3、数据读取速度小于数据写入速度
#include 
#include 
#include 
#include 
#include void write_buf(int type, QBuffer& buf)
{if(buf.open(QIODevice::WriteOnly)){QDataStream out(&buf);out << type;if(type == 0){out << QString("D.T.Software");out << QString("xiebs");}else if(type == 1){out << 3;out << 1415;}else if(type == 2){out << 3.1415;}buf.close();}
}void read_buf(QBuffer& buf)
{if(buf.open(QIODevice::ReadOnly)){QDataStream in(&buf);int type = -1;in >> type;if(type == 0){QString str1 = "";QString str2 = "";in >> str1;in >> str2;qDebug() << str1;qDebug() << str2;}else if(type == 1){int a = 0;int b = 0;in >> a;in >> b;qDebug() << a;qDebug() << b;}else if(type == 2){double value = 0;in >> value;qDebug() << value;}buf.close();}
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QByteArray array;QBuffer buf(&array);write_buf(1, buf);read_buf(buf);return a.exec();

在这里插入图片描述

2、目录操作

  • QDir 是 Qt 中功能强大的目录操作类
    — Qt 中的目录分隔符统一使用 '/'
    — QDir 能够对目录进行任意的操作(创建,删除,重命名)
    — QDir 能够获取目录在的所有条目(文件和文件夹)
    — QDir 能够使用过滤字符串获取指定条目
    — QDir 能够获取系统中的所有根目录
  • 目录操作基础示例
    在这里插入图片描述
#include 
#include 
#include 
#include void test_dir()
{const char* path = "C:/Users/xiebs/Desktop/QDir";QDir dir;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];}}
}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;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//test_dir();qDebug() << calculate_size("C:/Users/xiebs/Desktop/QDir");return a.exec();
}

分析:

QStringList list = dir.entryList();

这条语句得出的 list[i] 是文件名,不是路径,所以用

QFileInfoList list = dir.entryInfoList();

这样得出的 list[i] 是这样的。
在这里插入图片描述
这种其实就不是我们所说的路径,所以在 list[i]之后加上 .absoluteFilePath()得到的就是我们常见的路径。
在这里插入图片描述
在这样的 list[i] 之后加上 .fileName()得到的就是文件名。

3、文件系统监视器

  • QFileSystemWatcher 用于监控文件和目录的状态变化
    — 能够监控特定目录和文件的状态
    — 能够同时对多个目录和文件进行监控
    — 当目录或者文件发生改变时将触发信号
    — 可以通过信号与槽的机制捕捉信号并做出响应
  • 文件监控示例
    在这里插入图片描述

Watch.h

#ifndef WATCHER_H
#define WATCHER_H#include 
#include class Watcher : public QObject
{Q_OBJECT
private:QFileSystemWatcher m_watcher;private slots:void statusChanged(const QString& path);public:explicit Watcher(QObject *parent = nullptr);void addPath(QString path);
};#endif // WATCHER_H

Watch.cpp

#include "Watcher.h"
#include Watcher::Watcher(QObject *parent) : QObject(parent)
{connect(&m_watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(statusChanged(const QString&)));connect(&m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(statusChanged(const QString&)));
}void Watcher::statusChanged(const QString& path)
{qDebug() << path << "is changed!";
}void Watcher::addPath(QString path)
{m_watcher.addPath(path);
}

main.cpp

#include 
#include "Watcher.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Watcher watcher;watcher.addPath("C:/Users/xiebs/Desktop/xiebs.txt");watcher.addPath("C:/Users/xiebs/Desktop/QDir");return a.exec();
}

在这里插入图片描述
addPath() 这个函数的意思是 如果路径存在,则将路径添加到文件系统监视程序。如果路径不存在,或者已经被文件系统监视程序监视,则不添加该路径。

4、小结

  • 缓冲区的本质为一段连续的内存空间
  • 在Qt 中可以将缓冲区看作一种特殊的IO设备
  • QDIr提供了功能强大的目录操作支持
  • QFileSystemWatcher 能够监控文件和目录的状态变化

相关内容

热门资讯

原创 桐... 王明发 微信版第1847期 近期,广德市推出的“三件套”(广德炖锅、卡旺卡奶茶、詹记桃酥)火爆出圈,...
重庆—中亚、重庆—东南亚国际班... (来源:廊坊日报) 转自:廊坊日报 12月15日,中新多式联运示范项目重庆—东南亚班列在重庆鱼嘴站...
原创 沈... 12月12日,沈巍到达云南的第一天并没有露面,但一段由沈巍出镜的宣传片,在一家官方媒体上发布。 这家...
定边盐池,来早了的景点(先睹不... 盐池 看过不少,都在 青海 省境内, 陕西 定边 盐池 和 山西 运城 的 盐池 算是中原地区有名的...
焕新!泰山人民坊儿童乐园上线啦 从“缺一块”到“刚刚好”,宜川路街道泰山人民坊完成了一场“空间听诊”。在“两代表一委员”下社区活动中...