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 能够监控文件和目录的状态变化

相关内容

热门资讯

非洲水果“上新”中国年!首批南... 浦东机场海关高效验放首批上海口岸进口非洲西梅,周炜摄 日前,一批特殊的“旅客”跨越了万里之遥,悄然抵...
双梅争春寒樱也“醒”了,上海赏... 眼下,蜡梅与梅花“双梅争春”的好戏还在上演,可它们的主角之位已危在旦夕,因为以寒樱等早樱为代表的春花...
春节前必看!这份年货零食挑选指... 寒假期间,家长常会带着孩子一起逛超市。面对货架上琳琅满目的零食,不少家长感到无从下手:如何在满足孩子...
今天吃香香辣辣、外焦里嫩的辣子... 今天,我要隆重介绍一位厨房里的“辣”妹子——香香辣辣、外焦里嫩的辣子鸡!它就像一位热情奔放的舞者,在...
衡阳市中医医院:一碗没吃完的早... 1月28日早上,我院急诊科护士龙朝霞刚结束夜班,在医院门口早餐店坐下。早餐还未入口,身旁便传来一声微...