>>>QFileSystemWatcher 是 Qt 提供的一个类,用于监视文件和目录的变化。它允许应用程序监控一个或多个文件和目录,并在这些文件或目录内容发生变化时收到通知。这使得 Qt 应用程序能够动态响应文件系统的变化,比如文件的创建、修改或删除等。
addPath()
方法添加需要监视的文件或目录。fileChanged(const QString &path)
:当监视的文件内容发生变化时发出该信号。directoryChanged(const QString &path)
:当监视的目录内容(例如文件增加、删除或重命名)发生变化时发出该信号。QFileSystemWatcher
在多个操作系统上都可以使用,提供一致的接口和行为,方便在不同平台上开发和部署应用。>>>
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17SOURCES += \ filewatcher.cpp \ main.cpp \ mainwindow.cppHEADERS += \ filewatcher.h \ mainwindow.hFORMS += \ mainwindow.ui
#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
#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(); } }}
>>>
#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
#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;}
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; //w.show(); return a.exec();}
>>>
创建文件和改变文件等,会触发对应的槽函数
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$
>>>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有