• [Qt]用QFileSystemWatcher来监视文件和目录的改变


    Use Case: 两个程序共享同一个Configuration文件,当一个程序作出改变的时候,需要另外一个程序能够及时响应。

    之前其实猜的八九不离十,估计是有一个Timer,然后定时查询Configuration文件是否改变。

    今天兴趣来了,正好一看,果然,同时也感慨Qt之博大精深。

    废话莫谈,那我们就看看内部机制吧:

     -----------------------------------------------------

    Qt提供了QFileSystemWatcher类来监视文件和目录的改变。

    addPath/addPaths:

    设置需要监视的文件和目录

    removePath/removePaths:

    移除不需要监视的目录.  

    Signals:

    当监视的文件被修改或删除时,产生一个fileChanged()信号。

    如果被监视的目录被改变或删除,产生 directoryChanged()信号。

    Q_SIGNALS:
    void fileChanged(const QString &path);
    void directoryChanged(const QString &path);

    来源:

    Timer:

    void QPollingFileSystemWatcherEngine::run()
    {
    QTimer timer;
    connect(&timer, SIGNAL(timeout()), SLOT(timeout()));
    timer.start(PollingInterval);
    (void) exec();
    }


    文件比较,基本上就看文件属性有没有改变:

    class FileInfo
    {
    uint ownerId;
    uint groupId;
    QFile::Permissions permissions;
    QDateTime lastModified;
    QStringList entries;

    public:
    FileInfo(const QFileInfo &fileInfo)
    : ownerId(fileInfo.ownerId()),
    groupId(fileInfo.groupId()),
    permissions(fileInfo.permissions()),
    lastModified(fileInfo.lastModified())
    {
    if (fileInfo.isDir()) {
    entries = fileInfo.absoluteDir().entryList(QDir::AllEntries);
    }
    }
    FileInfo &operator=(const QFileInfo &fileInfo)
    {
    *this = FileInfo(fileInfo);
    return *this;
    }

    bool operator!=(const QFileInfo &fileInfo) const
    {
    if (fileInfo.isDir() && entries != fileInfo.absoluteDir().entryList(QDir::AllEntries))
    return true;
    return (ownerId != fileInfo.ownerId()
    || groupId != fileInfo.groupId()
    || permissions != fileInfo.permissions()
    || lastModified != fileInfo.lastModified());
    }
    };

    - Piaoger

  • 相关阅读:
    swiper 内容超出纵向滚动 解决办法
    js判断 微信浏览器 或者 QQ内置浏览器
    移动端滑动 增加弹性 滑动更加顺畅
    移动端点击激活时背景色
    文字两端对齐
    移动端元素被选中时,去除背景
    CSS动画 防止动画结束后,回归原位
    centos 防火墙配置
    知识图谱研究
    jmeter 压测工具
  • 原文地址:https://www.cnblogs.com/piaoger/p/2267356.html
Copyright © 2020-2023  润新知