Qt 使用QFileSystemWatcher 监控文本文件变化
- FileSystemWatcher通过监视指定路径的文件和目录的变化来监控文件系统。
调用addPath()函数来监视特定的文件或目录。可以使用addPaths()函数添加多个路径。通过使用removePath()和removePaths()函数可以删除已存在的路径。
QFileSystemWatcher检查添加到其中的每个路径。可以使用files()函数访问已添加到QFileSystemWatcher中的文件,使用directories()函数访问目录。
当文件被修改、重命名或从磁盘中删除时,会触发fileChanged()信号。类似地,当目录或其内容被修改或删除时,会触发directoryChanged()信号。请注意,一旦文件被重命名或从磁盘中删除,QFileSystemWatcher将停止监视该文件;一旦目录被从磁盘中删除,QFileSystemWatcher也将停止监视该目录。
注意:
在没有inotify支持的Linux内核上,包含被监视路径的文件系统无法卸载。
监视文件和目录的修改行为会消耗系统资源。这意味着您的进程可以同时监视的文件和目录数量是有限的。例如,在所有BSD变体中,每个被监视的文件需要一个打开的文件描述符。某些系统默认情况下限制打开的文件描述符数量为256。这意味着,如果您的进程尝试将超过256个文件或目录添加到文件系统监视器中,addPath()和addPaths()将会失败。还要注意,您的进程可能已经打开了其他文件描述符,除了被监视的文件之外,这些其他打开的描述符也会计入总数。macOS使用了不同的后端,所以不会遇到这个问题。
踩的坑
如果使用相对路径,- 注意demo.txt文件的位置,QDir::currentPath()可以打印当前工作路径
// mywatcher.h
#ifndef MYWATCHER_H
#define MYWATCHER_H
#include <QObject>
#include <QFileSystemWatcher>
#include <QDebug>
#include <QFile>
class MyWatcher : public QObject
{
Q_OBJECT
public:
MyWatcher(const QString& filePath, QObject *parent = nullptr)
: QObject(parent)
{
watcher.addPath(filePath);
connect(&watcher, &QFileSystemWatcher::fileChanged, this, &MyWatcher::fileChanged);
}
public slots:
void fileChanged(const QString& path)
{
QFile file(path);
if(file.open(QIODevice::ReadOnly|QIODevice::Text)){
qDebug()<<file.readAll();
}
}
private:
QFileSystemWatcher watcher;
QString filePath;
};
#endif // MYWATCHER_H
// main.c
#include <QCoreApplication>
#include <QDebug>
#include "mywatcher.h"
#include <QApplication>
#include <QDir>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString currentPath = QDir::currentPath();
qDebug() << "Current working directory: " << currentPath;
QString filePath = "./demo.txt";
MyWatcher watcher(filePath);
return a.exec();
}