文章目录
- @[toc]
- 1 概述
- 2 演示效果
- 3 简单使用示例
- 4 带界面的使用示例
- 5 源代码地址
文章目录
- @[toc]
- 1 概述
- 2 演示效果
- 3 简单使用示例
- 4 带界面的使用示例
- 5 源代码地址
更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1 概述
QT实现实时监控文件的创建、修改、删除操作
跟踪文件夹内容的增删改变化
可用于文件发生变化时自动触发相应处理逻辑
实现热重载机制,如配置文件更新后自动重新加载
基于
QFileSystemWatcher
实现;
QFileSystemWatcher
是 Qt 框架中的一个类,用于监控文件系统中文件和目录的变化。它提供了跨平台的文件系统监控功能,当被监视的文件或目录发生修改时,会发出相应的信号通知应用程序。- 主要功能
- 文件监控:监控单个文件的修改,如内容变更、删除等
- 目录监控:监控整个目录的变化,包括文件的添加、删除和修改
- 跨平台支持:在 Windows、Linux、macOS 等平台上提供一致的接口
典型应用场景
- 开发工具
- 代码编辑器监听源文件变化实现自动刷新
- 构建工具监听源码变更触发重新编译
- 文件同步服务
- 监控本地文件夹变化同步到云端
- 实现文件实时备份功能
- 系统管理
- 监控配置文件变化并动态调整程序行为
- 跟踪重要目录的安全变更记录
2 演示效果
3 简单使用示例
#include <QDebug>
#include <QCoreApplication>
#include <QFileSystemWatcher>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QFileSystemWatcher watcher;bool ret = watcher.addPath("./1.txt"); // 监听单个文件if(!ret){qDebug() << "监听1.txt失败";}watcher.addPath("./aaa"); // 监听文件夹QStringList rets = watcher.addPaths({"./2.txt", "./3.txt"}); // 监听多个文件if(!rets.isEmpty()){qDebug() << "监听失败:" << rets;}// 连接信号槽QObject::connect(&watcher, &QFileSystemWatcher::fileChanged,[](const QString &path) {qDebug() << "文件已更改:" << path;});QObject::connect(&watcher, &QFileSystemWatcher::directoryChanged,[](const QString &path) {qDebug() << "目录已更改:" << path;});return a.exec();
}
4 带界面的使用示例
- widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QFileSystemWatcher>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:void on_fileChanged(const QString &path);void on_directoryChanged(const QString &path);private slots:void on_but_add_file_clicked();void on_but_add_path_clicked();void on_but_remove_clicked();void on_but_show_clicked();private:Ui::Widget *ui;QFileSystemWatcher m_watcher;
};
#endif // WIDGET_H
- widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle(QString("Qt监听文件、文件夹变化 V%1").arg(APP_VERSION));connect(&m_watcher, &QFileSystemWatcher::fileChanged, this, &Widget::on_fileChanged);connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &Widget::on_directoryChanged);
}Widget::~Widget()
{delete ui;
}/*** @brief 当指定路径下的文件被修改、重命名或从磁盘删除时触发。* @param path*/
void Widget::on_fileChanged(const QString &path)
{ui->textEdit->append("文件更改:" + path);
}/*** @brief 当指定路径下的目录被修改(例如,当文件被添加或删除时)或从磁盘中删除时触发。* @param path*/
void Widget::on_directoryChanged(const QString &path)
{ui->textEdit->append("文件夹更改:" + path);
}/*** @brief 添加监听文件*/
void Widget::on_but_add_file_clicked()
{QString file = QFileDialog::getOpenFileName(this, "选择监听文件", "./", "文件(*)");if(!file.isEmpty()){bool ret = m_watcher.addPath(file);if(ret){ui->textEdit->append("添加监听文件:" + file);}else{ui->textEdit->append("添加监听文件失败:" + file);}}
}/*** @brief 添加监听路径*/
void Widget::on_but_add_path_clicked()
{QString path = QFileDialog::getExistingDirectory(this, "选择监听路径","./",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);if(!path.isEmpty()){bool ret = m_watcher.addPath(path);if(ret){ui->textEdit->append("添加监听路径:" + path);}else{ui->textEdit->append("添加监听路径失败:" + path);}}
}void Widget::on_but_remove_clicked()
{for(auto& file : m_watcher.files()){bool ret = m_watcher.removePath(file);if(ret){ui->textEdit->append("移除监听文件:" + file);}}for(auto& dir : m_watcher.directories()){bool ret = m_watcher.removePath(dir);if(ret){ui->textEdit->append("移除监听路径:" + dir);}}
}void Widget::on_but_show_clicked()
{for(auto& file : m_watcher.files()){ui->textEdit->append(file);}for(auto& dir : m_watcher.directories()){ui->textEdit->append(dir);}
}
5 源代码地址
- gitee
- github