用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM