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
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
