QFileSystemWatcher

来源:互联网 发布:python升级到2.7 pip 编辑:程序博客网 时间:2024/06/01 22:13

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