qt监测文件新增的内容_[Qt]用QFileSystemWatcher来监视文件和目录的改变

本文介绍了如何利用Qt的QFileSystemWatcher类来实时监控文件和目录的改动。当文件或目录发生变化时,该类会发出fileChanged()或directoryChanged()信号。示例场景是一个程序修改配置文件后,另一个程序能即时响应。内部实现涉及到定时器和文件属性对比。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值