用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)相关的知识,希望对你有一定的参考价值。

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

http://www.xuebuyuan.com/363908.html

以上是关于用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QFileSystemWatcher 监视文件夹的更改

Qt 文件监视器 QFileSystemWatcher

QSocketNotifier - 如何使用它来观看文件? - linux

使用 QFileSystemWatcher 获取更改文件的路径?

QFileSystemWatcher 不为另一个应用程序所做的更改发出 fileChanged 信号

6.7 监控文件和目录