• [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

  • 相关阅读:
    UIImagePickerController从拍照、图库、相册获取图片
    swift2.0 UIImagePickerController 拍照 相册 录像
    UIImagePickerController拍照与摄像
    iOS 从相机或相册获取图片并裁剪
    Android播放音频的两种方式
    UICollectionView的基本使用
    UIImageView圆角,自适应图片宽高比例,图片拉伸,缩放比例和图片缩微图
    UIView属性clipsTobounds的应用
    iOS开发UI篇—CALayer简介
    chrome插件演示,经js转让chrome api清除浏览器缓存
  • 原文地址:https://www.cnblogs.com/piaoger/p/2267356.html
Copyright © 2020-2023  润新知