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

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

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。
  1. #ifndef FILESYSTEM_H
  2. #define FILESYSTEM_H
  3. #include <QObject>
  4. #include <QMap>
  5. #include <QString>
  6. #include <QMap>
  7. #include <QFileSystemWatcher>
  8. class FileSystemWatcher : public QObject
  9. {
  10.     Q_OBJECT
  11. public:
  12.     static void addWatchPath(QString path);
  13. public slots:
  14.     // 目录更新时调用
  15.     void directoryUpdated(const QString &path);
  16.     // 文件被修改时调用
  17.     void fileUpdated(const QString &path);
  18. private:
  19.     explicit FileSystemWatcher(QObject *parent = 0);
  20. private:
  21.     // 单例
  22.     static FileSystemWatcher *m_pInstance;
  23.     // QFileSystemWatcher变量
  24.     QFileSystemWatcher *m_pSystemWatcher;
  25.     // 当前每个监控的内容目录列表
  26.     QMap<QString, QStringList> m_currentContentsMap;
  27. };
  28. #endif // FILESYSTEM_H
复制代码
接着是filesystem.cpp主函数部门,首先FileSystemWatcher::addWatchPath用于增长一个监控目录。这里的重点在于创建两个信号,当m_pSystemWatcher收到监控数据时,我们让其分别去触发directoryChanged与fileChanged两个信号,在信号中分别携带一个参数传递给directoryUpdated与fileUpdated槽函数上进行处理,如果是目录则生存目录中的内容。
  1. void FileSystemWatcher::addWatchPath(QString path)
  2. {
  3.    qDebug() << QString("添加监控目录: %1").arg(path);
  4.     if (m_pInstance == NULL)
  5.     {
  6.         m_pInstance = new FileSystemWatcher();
  7.         m_pInstance->m_pSystemWatcher = new QFileSystemWatcher();
  8.         // 连接QFileSystemWatcher的directoryChanged和fileChanged信号到相应的槽
  9.         connect(m_pInstance->m_pSystemWatcher, SIGNAL(directoryChanged(QString)), m_pInstance, SLOT(directoryUpdated(QString)));
  10.         connect(m_pInstance->m_pSystemWatcher, SIGNAL(fileChanged(QString)), m_pInstance, SLOT(fileUpdated(QString)));
  11.     }
  12.     // 添加监控路径
  13.     m_pInstance->m_pSystemWatcher->addPath(path);
  14.     // 如果添加路径是一个目录,保存当前内容列表
  15.     QFileInfo file(path);
  16.     if (file.isDir())
  17.     {
  18.         const QDir dirw(path);
  19.         m_pInstance->m_currentContentsMap[path] = dirw.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
  20.     }
  21. }
复制代码
接着是FileSystemWatcher::directoryUpdated函数的实现部门,如下所示代码,通过QFileSystemWatcher来监听指定目录下文件和子目录的变化。当目录发生变化时,调用directoryUpdated槽函数,比力最新的目录内容和之前生存的内容,找出新增文件、删除文件以及文件重定名等变化。

  • 功能概述

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

代码对文件系统的变化进行了细致的监控和处理,可以用于及时监控目录下文件的变动情况,比方新增文件、删除文件和文件重定名等操作。当用户需要自界说功能时可以在信息输出前对特定目录做进一步处理以达到监视并控制特定文件的功能。
[code]// 任何监控的目录更新(添加、删除、重定名)则调用void FileSystemWatcher::directoryUpdated(const QString &path){    qDebug()
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表