Qt 实现文件监控程序
flyfish
实现了一个文件监控程序,使用 Qt 框架来监控指定目录中的文件变化,可以监控文件的创建、删除、修改等操作,并将这些操作记录到一个日志文件中。
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QDir>
#include <QFileInfo>
#include <QSet>
#include <iostream>// 日志函数,用于将事件记录到日志文件中
void logEvent(const QString &event, const QString &path) {// 打开日志文件,如果文件不存在则创建QFile logFile("file_monitor.log");if (logFile.open(QIODevice::Append | QIODevice::Text)) {// 创建文本流对象,用于写入日志QTextStream out(&logFile);// 写入日志条目,包括时间戳、事件类型和文件路径out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")<< " - " << event << ": " << path << "\n";// 关闭日志文件logFile.close();} else {// 如果无法打开日志文件,输出错误信息std::cerr << "Failed to open log file." << std::endl;}
}// 文件监控类,继承自 QObject
class FileMonitor : public QObject {Q_OBJECTpublic:// 构造函数,初始化文件监控对象explicit FileMonitor(const QString &path, QObject *parent = nullptr): QObject(parent), watcher(new QFileSystemWatcher(this)), rootPath(path) {// 将指定的目录添加到文件系统监视器中watcher->addPath(rootPath);// 获取初始文件列表QDir dir(rootPath);initialFiles = dir.entryList(QDir::Files);// 连接信号与槽,当目录或文件发生变化时触发相应的槽函数connect(watcher, &QFileSystemWatcher::directoryChanged, this, &FileMonitor::onDirectoryChanged);connect(watcher, &QFileSystemWatcher::fileChanged, this, &FileMonitor::onFileChanged);}private slots:// 当目录发生变化时调用的槽函数void onDirectoryChanged(const QString &path) {// 输出目录变化的信息std::cout << "Directory changed: " << qPrintable(path) << std::endl;// 获取当前文件列表QDir dir(rootPath);QStringList currentFiles = dir.entryList(QDir::Files);// 检查新增文件QSet<QString> newFiles = QSet<QString>(currentFiles.begin(), currentFiles.end()).subtract(QSet<QString>(initialFiles.begin(), initialFiles.end()));for (const QString &file : newFiles) {// 记录新增文件的事件logEvent("File created", dir.absoluteFilePath(file));}// 检查删除文件QSet<QString> deletedFiles = QSet<QString>(initialFiles.begin(), initialFiles.end()).subtract(QSet<QString>(currentFiles.begin(), currentFiles.end()));for (const QString &file : deletedFiles) {// 记录删除文件的事件logEvent("File deleted", dir.absoluteFilePath(file));}// 更新初始文件列表为当前文件列表initialFiles = currentFiles;}// 当文件发生变化时调用的槽函数void onFileChanged(const QString &path) {// 输出文件变化的信息std::cout << "File changed: " << qPrintable(path) << std::endl;// 记录文件修改的事件logEvent("File modified", path);}private:// 文件系统监视器对象QFileSystemWatcher *watcher;// 要监控的根目录路径QString rootPath;// 初始文件列表QStringList initialFiles;
};int main(int argc, char *argv[]) {// 创建 QCoreApplication 对象,这是 Qt 应用程序的入口点QCoreApplication a(argc, argv);// 设置要监控的目录路径QString watchPath = "/home/sisyphus/watcher/"; // 替换为你要监控的实际路径// 创建文件监控对象,传入要监控的目录路径FileMonitor monitor(watchPath);// 运行应用程序的事件循环return a.exec();
}#include "main.moc"
日志函数 logEvent:
用于将文件变化的事件记录到日志文件中。
打开日志文件 file_monitor.log,如果文件不存在则创建。
使用 QTextStream 将日志条目写入文件,包括时间戳、事件类型和文件路径。
如果无法打开日志文件,输出错误信息。
FileMonitor 类:
继承自 QObject,使用 Q_OBJECT 宏。
成员变量:
QFileSystemWatcher *watcher:文件系统监视器对象,用于监控文件和目录的变化。
QString rootPath:要监控的根目录路径。
QStringList initialFiles:初始文件列表,用于记录目录中的初始文件。
构造函数:
初始化 QFileSystemWatcher 对象,并将指定的目录添加到监视器中。
获取初始文件列表。
连接 QFileSystemWatcher 的信号与槽,当目录或文件发生变化时触发相应的槽函数。
onDirectoryChanged 槽:
当目录发生变化时调用。
获取当前文件列表。
比较当前文件列表和初始文件列表,记录新增和删除的文件。
更新初始文件列表为当前文件列表。
onFileChanged 槽:
当文件发生变化时调用。
记录文件修改的事件。