当前位置: 首页 > news >正文

C++ Qt开发:QFileSystemWatcher文件监视组件

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或目录的监视功能。

QFileSystemWatcher 是 Qt 框架中提供的一个类,用于监视文件系统中的文件和目录的变化。它允许你在文件或目录发生变化时接收通知,并可以用于监视文件的创建、删除、重命名以及内容修改等操作。这对于需要实时监控文件系统变化的应用程序是非常有用的。

下面是关于 QFileSystemWatcher 类的一些常用函数的解释:

函数描述
QFileSystemWatcher(QObject *parent = nullptr)构造函数,创建一个文件系统监视器对象。
void addPath(const QString &path)添加要监视的文件或目录路径。
void addPaths(const QStringList &paths)添加要监视的多个文件或目录路径。
bool removePath(const QString &path)移除要监视的文件或目录路径。
void removePaths(const QStringList &paths)移除要监视的多个文件或目录路径。
bool contains(const QString &path) const检查监视器是否包含指定的文件或目录路径。
QStringList files() const返回当前监视的文件路径列表。
QStringList directories() const返回当前监视的目录路径列表。
void setFilter(QFileSystemWatcher::Filter filter)设置监视器的过滤器,用于指定要监视的事件类型。
QFileSystemWatcher::Filter filter() const返回监视器当前的过滤器设置。
void fileChanged(const QString &path)信号,当监视的文件发生变化时发出。
void directoryChanged(const QString &path)信号,当监视的目录发生变化时发出。

这些函数允许你动态地添加或移除要监视的文件或目录,设置过滤器以确定要监视的事件类型,并连接相应的信号以处理文件系统的变化事件。

首先我们需要新增一个filesystem.h头文件,该类主要用于实现对文件访问的封装,其中addWatchPath用于增加一个被监控目录,当目录被更新世则调用directoryUpdated,文件被修改调用fileUpdated

#ifndef FILESYSTEM_H
#define FILESYSTEM_H
#include <QObject>
#include <QMap>
#include <QString>
#include <QMap>
#include <QFileSystemWatcher>class FileSystemWatcher : public QObject
{Q_OBJECTpublic:static void addWatchPath(QString path);public slots:// 目录更新时调用void directoryUpdated(const QString &path);// 文件被修改时调用void fileUpdated(const QString &path);private:explicit FileSystemWatcher(QObject *parent = 0);private:// 单例static FileSystemWatcher *m_pInstance;// QFileSystemWatcher变量QFileSystemWatcher *m_pSystemWatcher;// 当前每个监控的内容目录列表QMap<QString, QStringList> m_currentContentsMap;
};#endif // FILESYSTEM_H

接着是filesystem.cpp主函数部分,首先FileSystemWatcher::addWatchPath用于增加一个监控目录。这里的重点在于创建两个信号,当m_pSystemWatcher收到监控数据时,我们让其分别去触发directoryChangedfileChanged两个信号,在信号中分别携带一个参数传递给directoryUpdatedfileUpdated槽函数上进行处理,如果是目录则保存目录中的内容。

void FileSystemWatcher::addWatchPath(QString path)
{qDebug() << QString("添加监控目录: %1").arg(path);if (m_pInstance == NULL){m_pInstance = new FileSystemWatcher();m_pInstance->m_pSystemWatcher = new QFileSystemWatcher();// 连接QFileSystemWatcher的directoryChanged和fileChanged信号到相应的槽connect(m_pInstance->m_pSystemWatcher, SIGNAL(directoryChanged(QString)), m_pInstance, SLOT(directoryUpdated(QString)));connect(m_pInstance->m_pSystemWatcher, SIGNAL(fileChanged(QString)), m_pInstance, SLOT(fileUpdated(QString)));}// 添加监控路径m_pInstance->m_pSystemWatcher->addPath(path);// 如果添加路径是一个目录,保存当前内容列表QFileInfo file(path);if (file.isDir()){const QDir dirw(path);m_pInstance->m_currentContentsMap[path] = dirw.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);}
}

接着是FileSystemWatcher::directoryUpdated函数的实现部分,如下所示代码,通过QFileSystemWatcher来监听指定目录下文件和子目录的变化。当目录发生变化时,调用directoryUpdated槽函数,比较最新的目录内容和之前保存的内容,找出新增文件、删除文件以及文件重命名等变化。

  • 功能概述
    1. 添加监控路径:通过addWatchPath函数添加监控路径,创建QFileSystemWatcher对象并连接相关信号和槽。
    2. 目录更新处理:当监控的目录发生变化时,调用directoryUpdated槽函数。
    3. 内容变化比较:比较最新的目录内容和之前保存的内容,找出新增文件、删除文件和文件重命名等变化。
    4. 文件重命名处理:如果有文件重命名,输出文件重命名的信息。
    5. 新增文件处理:输出新建文件的信息,并可以在相应的逻辑中处理每个新文件。
    6. 删除文件处理:输出删除文件的信息,并可以在相应的逻辑中处理每个被删除的文件。

代码对文件系统的变化进行了细致的监控和处理,可以用于实时监控目录下文件的变动情况,例如新增文件、删除文件和文件重命名等操作。当用户需要自定义功能时可以在信息输出前对特定目录做进一步处理以达到监视并控制特定文件的功能。

// 任何监控的目录更新(添加、删除、重命名)则调用
void FileSystemWatcher::directoryUpdated(const QString &path)
{qDebug() << QString("目录更新: %1").arg(path);// 比较最新的内容和保存的内容找出区别(变化)QStringList currEntryList = m_currentContentsMap[path];const QDir dir(path);QStringList newEntryList = dir.entryList(QDir::NoDotAndDotDot  | QDir::AllDirs | QDir::Files, QDir::DirsFirst);QSet<QString> newDirSet = QSet<QString>::fromList(newEntryList);QSet<QString> currentDirSet = QSet<QString>::fromList(currEntryList);// 添加了文件QSet<QString> newFiles = newDirSet - currentDirSet;QStringList newFile = newFiles.toList();// 文件已被移除QSet<QString> deletedFiles = currentDirSet - newDirSet;QStringList deleteFile = deletedFiles.toList();// 更新当前设置m_currentContentsMap[path] = newEntryList;if (!newFile.isEmpty() && !deleteFile.isEmpty()){// 文件/目录重命名if ((newFile.count() == 1) && (deleteFile.count() == 1)){qDebug() << QString("文件重命名 %1 到 %2").arg(deleteFile.first()).arg(newFile.first());}}else{// 添加新文件/目录至Dirif (!newFile.isEmpty()){qDebug() << "新建文件或目录: " << newFile;foreach (QString file, newFile){// 处理操作每个新文件....}}// 从Dir中删除文件/目录if (!deleteFile.isEmpty()){qDebug() << "删除文件或目录: " << deleteFile;foreach(QString file, deleteFile){// 处理操作每个被删除的文件....}}}
}

同理,当文件被修改时则调用fileUpdated函数,只需要去除绝对路径与文件名即可,如下代码所示;

void FileSystemWatcher::fileUpdated(const QString &path)
{QFileInfo file(path);QString strPath = file.absolutePath();QString strName = file.fileName();qDebug() << QString("文件 %1 路径 %2 修改").arg(strName).arg(strPath);
}

你可以自行运行课件FileSystemWatcher.zip来观察监控效果,如下图;

相关文章:

C++ Qt开发:QFileSystemWatcher文件监视组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或…...

window Zookeeper 启动;

文章目录 前言一、Zookeeper 介绍&#xff1a;二、window 使用&#xff1a;2.1 下载&#xff1a;2.2 启动2.3 连接&#xff1a; 总结 前言 本文对window Zookeeper zk 启动 进行介绍&#xff1b; 一、Zookeeper 介绍&#xff1a; ZooKeeper 是一个开源的分布式协调服务&#…...

数据分析-Pandas如何画图验证数据随机性

数据分析-Pandas如何画图验证数据随机性 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…...

地球系统模式(CESM)

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…...

数据通信练习题

1.0osi七层模型 应用层 data 表示层 会话层 传输层 数据段 防火墙&#xff0c;端口&#xff08;TCP UDP&#xff09; 网络层 数据包 路由器 数据链路层 数据帧 交换机 物理层 比特流 网卡 2.IP地址分类 私有地址 A类 0--127 10.0.0.0…...

本地部署推理TextDiffuser-2:释放语言模型用于文本渲染的力量

系列文章目录 文章目录 系列文章目录一、模型下载和环境配置二、模型训练&#xff08;一&#xff09;训练布局规划器&#xff08;二&#xff09;训练扩散模型 三、模型推理&#xff08;一&#xff09;准备训练好的模型checkpoint&#xff08;二&#xff09;全参数推理&#xff…...

设计模式: 模板方法模式

文章目录 一、什么是模板方法模式二、模板方法模式结构三、优点 一、什么是模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将一些步骤延迟到子类中实现。这样可以使得子类…...

C++ 打印输出十六进制数 指定占位符前面填充0

C 打印十六进制数据&#xff0c;指定数据长度&#xff0c;前面不够时&#xff0c;补充0. 代码如下&#xff1a; #include <iostream> #include <iomanip> #include <cmath>using namespace std;int main() {unsigned int id 0xc01;unsigned int testCaseId…...

基于 Win Server 2008 复现 IPC$ 漏洞

写在前面 本篇博客演示了使用 winXP&#xff08;配合部分 win10 的命令&#xff09;对 win server 2008 的 IPC$ 漏洞进行内网渗透&#xff0c;原本的实验是要求使用 win server 2003&#xff0c;使用 win server 2003 可以规避掉很多下面存在的问题&#xff0c;建议大家使用 …...

HTML笔记2

11&#xff0c;路径 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> <…...

使用Docker实现Jenkins+Python + Pytest +Allure 接口自动化

一、Jenkins搭建 参考《Docker 安装 Jenkins》 进入 jenkins 容器 CLI 界面 docker exec -itu root jenkins /bin/bash二、准备条件 1、替换镜像内源 为了安装wget&#xff0c;默认用yum会安装不上wget命令&#xff0c;参考文章《docker容器内如何更换yum源【只想换成国内…...

论企业安全漏洞扫描的重要性

前言 随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而安全漏洞…...

23.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-实现配置工具数据结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;22.加载配置文件…...

STM32CubeMX学习笔记20——SD卡FATFS文件系统

1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构&#xff08;即在存储设备上组织文件的方法&#xff09;。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统&#xff1b;不带文件系统的SD卡仅能…...

Facebook商城号为什么被封?如何防封?

由于Facebook商城的高利润空间&#xff0c;越来越多的跨境电商商家注意到它的存在。Facebook作为全球最大、用户量最大的社媒平台&#xff0c;同时也孕育了一个巨大的商业生态&#xff0c;包括广告投放、商城交易等。依托背后的大流量&#xff0c;Facebook商城起号较快&#xf…...

【教程】APP备案全攻略:确保你的应用合规上线

【教程】APP备案全攻略&#xff1a;确保你的应用合规上线 摘要 本文详细介绍了中国大陆地区互联网信息服务提供者&#xff08;AP&#xff09;进行APP备案的流程、要求和注意事项。包括备案对象、备案方式、备案内容、备案流程等方面的详细说明&#xff0c;帮助开发者顺利完成…...

Vue入门2

v-model 原理&#xff1a;v-model本质上是一个语法糖。例如应用于输入框&#xff0c;就是value属性和input事件的合写。 作用&#xff1a;提供数据的双向绑定 数据变&#xff0c;视图跟着变 :value视图变&#xff0c;数据跟着变 input 注意&#xff1a;$event用于在模板中&…...

简介:CMMI软件能力成熟度集成模型

前言 CMMI是英文Capability Maturity Model Integration的缩写。 CMMI认证简称软件能力成熟度集成模型&#xff0c;是鉴定企业在开发流程化和质量管理上的国际通行标准&#xff0c;全球软件生产标准大都以此为基点&#xff0c;并都努力争取成为CMMI认证队伍中的一分子。 对一个…...

mysql的其他问题

1.MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f; a. 设计良好的数据库结构&#xff0c;允许部分数据冗余&#xff0c;尽量避免join查询&#xff0c;提高效率。 b. 选择合适的表字段数据类型和存储引擎&#xf…...

数据结构---复杂度(2)

1.斐波那契数列的时间复杂度问题 每一行分别是2^0---2^1---2^2-----2^3-------------------------------------------2^(n-2) 利用错位相减法&#xff0c;可以得到结果是&#xff0c;2^(n-1)-1,其实还是要减去右下角的灰色部分&#xff0c;我们可以拿简单的数字进行举例子&…...

STM32F407驱动4位数码管:从硬件连接到动态扫描编程实战

1. 硬件连接&#xff1a;从零搭建STM32F407与数码管的桥梁 第一次接触数码管驱动时&#xff0c;最让我头疼的就是硬件连线。记得当时拿着杜邦线在开发板和数码管模块之间来回比划&#xff0c;生怕接错线烧坏设备。其实只要理解几个关键点&#xff0c;连接过程会变得非常简单。…...

告别网络依赖:HY-MT1.5-1.8B离线翻译模型保姆级手机端部署指南

告别网络依赖&#xff1a;HY-MT1.5-1.8B离线翻译模型保姆级手机端部署指南 1. 引言 在移动互联网时代&#xff0c;语言障碍仍然是全球交流的主要壁垒之一。传统翻译工具依赖云端服务&#xff0c;不仅需要稳定的网络连接&#xff0c;还存在隐私泄露风险。腾讯混元团队于2025年…...

Qwen3-TTS声音设计入门:零基础学会用文字创造各种语音风格

Qwen3-TTS声音设计入门&#xff1a;零基础学会用文字创造各种语音风格 1. 认识Qwen3-TTS声音设计 1.1 什么是语音风格设计 想象一下&#xff0c;你正在为视频配音&#xff0c;需要不同的声音&#xff1a;一个温柔的女声讲解产品&#xff0c;一个活泼的童声介绍玩具&#xff…...

Java开发者必备:SmallThinker-3B-Preview辅助编程与八股文解答

Java开发者必备&#xff1a;SmallThinker-3B-Preview辅助编程与八股文解答 作为一名写了十几年Java的老码农&#xff0c;我深知日常开发中的痛点&#xff1a;有时候一个简单的Spring Boot控制器&#xff0c;却要花时间翻文档、查示例&#xff1b;面对面试官抛出的JVM原理、并发…...

bootstrap怎么设置表单为水平布局

Bootstrap 5 中需用 row align-items-center col-auto col-form-label 和 col 包裹 input 实现水平对齐&#xff1b;form-group 和 col-sm-2 等 v4 类已失效&#xff1b;复选框须用 form-check 结构&#xff1b;form-floating 不适用于水平布局。Bootstrap 5 中怎么让 label …...

Youtu-Parsing模型重装系统后快速恢复:开发环境与模型服务一键配置脚本

Youtu-Parsing模型重装系统后快速恢复&#xff1a;开发环境与模型服务一键配置脚本 每次重装系统或者换新电脑&#xff0c;最头疼的是什么&#xff1f;对我来说&#xff0c;就是重新搭建开发环境。特别是那些依赖复杂的AI模型项目&#xff0c;比如Youtu-Parsing模型&#xff0…...

避开这些坑!Unity WebGL本地部署Nginx的5个关键配置点

Unity WebGL本地Nginx部署避坑指南&#xff1a;5个关键配置解析 当Unity开发者将项目导出为WebGL格式并在本地通过Nginx部署时&#xff0c;常常会遇到各种棘手的配置问题。本文聚焦五个最容易被忽视却至关重要的配置环节&#xff0c;帮助开发者绕过常见陷阱&#xff0c;实现顺畅…...

SIwave TDR仿真实战:从模型导入到阻抗结果深度解析

1. SIwave TDR仿真基础与实战价值 TDR&#xff08;时域反射计&#xff09;仿真是高速电路设计中不可或缺的验证手段。我第一次接触SIwave的TDR功能是在一个10Gbps SerDes链路项目中&#xff0c;当时遇到了信号完整性问题却苦于找不到准确的阻抗突变点。传统频域仿真虽然能给出S…...

密码学·顶级会议与资源导航

1. 密码学研究的黄金殿堂&#xff1a;三大顶级会议详解 第一次接触密码学领域时&#xff0c;最让我困惑的就是如何找到高质量的学术资源。直到导师告诉我&#xff1a;"盯住三大会议&#xff0c;你就抓住了密码学的命脉。"这句话彻底改变了我的研究方向。Crypto、Euro…...

云厂商集体涨价实录:AWS/阿里云/腾讯云2026年Q1成本变化全解析与应对方案

前言2026年4月&#xff0c;亚马逊股东信正式披露&#xff1a;AWS AI服务年化收入突破150亿美元&#xff0c;自研芯片业务年化收入超200亿美元。与此同时&#xff0c;腾讯云宣布年内第二次调价&#xff0c;这已经是今年Q1以来全球主要云厂商的第N次集体涨价动作了。本文整理了各…...