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

