Qt 使用QFileSystemWatcher 监控文本文件变化

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();
}


在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值