前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Qt | Linux+QFileSystemWatcher文件夹和文件监视(例如监视U盘挂载目录)

Qt | Linux+QFileSystemWatcher文件夹和文件监视(例如监视U盘挂载目录)

原创
作者头像
Qt历险记
发布于 2024-09-26 14:14:33
发布于 2024-09-26 14:14:33
33900
代码可运行
举报
运行总次数:0
代码可运行

01、QFileSystemWatcher

>>>QFileSystemWatcher 是 Qt 提供的一个类,用于监视文件和目录的变化。它允许应用程序监控一个或多个文件和目录,并在这些文件或目录内容发生变化时收到通知。这使得 Qt 应用程序能够动态响应文件系统的变化,比如文件的创建、修改或删除等。

  1. 监视文件和目录: 可以监视一个或多个文件和目录,可以通过 addPath() 方法添加需要监视的文件或目录。
  2. 信号通知:
    • fileChanged(const QString &path):当监视的文件内容发生变化时发出该信号。
    • directoryChanged(const QString &path):当监视的目录内容(例如文件增加、删除或重命名)发生变化时发出该信号。
  3. 跨平台支持QFileSystemWatcher 在多个操作系统上都可以使用,提供一致的接口和行为,方便在不同平台上开发和部署应用。

02、创建项目Qt6.5.3

>>>

03、 FileWatcher.pro

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QT       += core gui​greaterThan(QT_MAJOR_VERSION, 4): QT += widgets​CONFIG += c++17SOURCES += \    filewatcher.cpp \    main.cpp \    mainwindow.cpp​HEADERS += \    filewatcher.h \    mainwindow.h​FORMS += \    mainwindow.ui​

04、filewatcher.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef FILEWATCHER_H#define FILEWATCHER_H​#include <QObject>#include <QFileSystemWatcher>#include <QStringList>#include <QDebug>class FileWatcher : public QObject{    Q_OBJECTpublic:    explicit FileWatcher(const QStringList &paths, QObject *parent = nullptr);    ~FileWatcher();​signals:protected slots:    void onFileChanged(const QString &filePath);    void onDirectoryChanged(const QString &dirPath);private:    QFileSystemWatcher *watcher = nullptr;};​#endif // FILEWATCHER_H​

05、filewatcher.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "filewatcher.h"​#include <QFileInfo>#include <QDir>​FileWatcher::FileWatcher(const QStringList &paths, QObject *parent)    : QObject{parent}{    // 创建一个 QFileSystemWatcher 实例    watcher = new QFileSystemWatcher(this);​    // 添加要监视的文件和文件夹    for (const QString &path : paths) {        if (QFileInfo(path).isFile()) {            connect(watcher, &QFileSystemWatcher::fileChanged, this, &FileWatcher::onFileChanged);            watcher->addPath(path);            qDebug() << "监视文件:" << path;        }        else if (QFileInfo(path).isDir()) {            // 监视目录            connect(watcher, &QFileSystemWatcher::directoryChanged, this, &FileWatcher::onDirectoryChanged);            watcher->addPath(path);            qDebug() << "监视目录:" << path;        }    }}​FileWatcher::~FileWatcher(){​}​void FileWatcher::onFileChanged(const QString &filePath) {    qDebug() << "文件内容变化:" << filePath;    // 在这里可以添加处理文件变化的逻辑    QFile file(filePath);    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {        qDebug() << "无法打开文件:" << file.errorString();        return;    }​    QTextStream in(&file);    QString fileContent;    while (!in.atEnd()) {        fileContent += in.readLine() + "\n"; // 读取每一行,并添加换行符    }​    file.close();​    // 输出文件内容到调试控制台    qDebug() << "文件内容:\n" << fileContent;}​void FileWatcher::onDirectoryChanged(const QString &dirPath) {    qDebug() << "目录内容变化:" << dirPath;    // 在这里可以添加处理目录变化的逻辑    QDir dir(dirPath);    if (!dir.exists()) {        qDebug() << "目录不存在:" << dirPath;        return;    }​    // 获取目录下的所有文件和目录    QFileInfoList fileInfoList = dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);​    for (const QFileInfo &fileInfo : fileInfoList) {        if (fileInfo.isDir()) {            qDebug() << "目录:" << fileInfo.absoluteFilePath();            // 递归地列出子目录            onDirectoryChanged(fileInfo.absoluteFilePath());        } else {            qDebug() << "文件:" << fileInfo.absoluteFilePath();        }    }}​

>>>

06、mainwindow.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef MAINWINDOW_H#define MAINWINDOW_H​#include <QMainWindow>​#include "filewatcher.h"​​QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow;}QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = nullptr);    ~MainWindow();private:    Ui::MainWindow *ui;    FileWatcher *fileWatcher; // 声明 FileWatcher 指针};#endif // MAINWINDOW_H​

07、mainwindow.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "mainwindow.h"#include "ui_mainwindow.h"​​MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);// readlink -f a.txt mydir/    // /home/whois/MyQProject/a.txt    // /home/whois/MyQProject/mydir​    QStringList paths;    paths << "/home/whois/MyQProject/a.txt" << "/home/whois/MyQProject/mydir"; // 替换为你要监视的路径​    fileWatcher = new FileWatcher(paths, this); // 使用 new 创建对象并将 this 传入}​MainWindow::~MainWindow(){    // 不需要手动 delete fileWatcher,因为它已经用父对象(this)管理,析构时自动释放    delete ui;}​

08、main.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "mainwindow.h"​#include <QApplication>​int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    //w.show();    return a.exec();}​

10、调试程序

>>>

创建文件和改变文件等,会触发对应的槽函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
whois@ubuntu:~$ cd MyQProject/whois@ubuntu:~/MyQProject$ lsboost  FileWatcher  hellowhois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ echo 123 >> a.txtwhois@ubuntu:~/MyQProject$ lsa.txt  boost  FileWatcher  hellowhois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ mkdir mydirwhois@ubuntu:~/MyQProject$ lsa.txt  boost  FileWatcher  hello  mydirwhois@ubuntu:~/MyQProject$ readlink -f a.txt mydir//home/whois/MyQProject/a.txt/home/whois/MyQProject/mydirwhois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ echo 23333 >> a.txt whois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ echo 23333 >> a.txt whois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ cd mydir/whois@ubuntu:~/MyQProject/mydir$ lswhois@ubuntu:~/MyQProject/mydir$ whois@ubuntu:~/MyQProject/mydir$ mkdir subdirwhois@ubuntu:~/MyQProject/mydir$ mkdir subdirmkdir: 无法创建目录 “subdir”: 文件已存在whois@ubuntu:~/MyQProject/mydir$ whois@ubuntu:~/MyQProject/mydir$ whois@ubuntu:~/MyQProject/mydir$ cd ..whois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ lsa.txt  boost  FileWatcher  hello  mydirwhois@ubuntu:~/MyQProject$ whois@ubuntu:~/MyQProject$ echo "123222" a.txt 123222 a.txtwhois@ubuntu:~/MyQProject$ echo "123222" >> a.txt whois@ubuntu:~/MyQProject$ cp a.txt mydir/whois@ubuntu:~/MyQProject$​

应用场景

>>>

  1. 备份工具
    • 用户文件和数据库的实时监控,自动备份用户对文件的修改,确保数据的安全性和完整性。
  2. 日志监控
    • 日志文件的监控,用于实时检测应用程序或系统的运行状况,自动发出警报或记录异常事件。
  3. 版本控制系统
    • 实时监控项目文件的变化,帮助团队成员了解文件的更改记录,支持版本的控制和合并工作。
  4. 文件同步工具
    • 应用程序如云存储服务(如 Dropbox、Google Drive 等)监测指定文件夹的变化,自动上传或同步文件到云端。
  5. 内容管理系统
    • 在网站或应用程序中监控内容文件的变化,自动更新网站的展示或触发相应的处理逻辑。
  6. 配置文件监控
    • 监视系统或应用配置文件的变化,自动重新加载配置,适用于服务器和应用程序的动态配置管理。
  7. 自动化脚本
    • 自动化处理流程中监测输入文件变化,触发相应的处理脚本或工作流,以提高工作效率。
  8. 安全监控
    • 检测特定文件和目录的未授权更改,增加系统的安全性,防止数据泄露和篡改。
  9. 开发工具
    • 集成开发环境IDE)中实时监控源代码文件变化,支持实时编译、热更新和调试功能。
  10. 文件审计
    • 对文件访问、修改和删除进行监控,确保法律法规合规,尤其在金融、医疗等领域有重要应用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验