Qt 文件監視器 QFileSystemWatcher


之前有過對Qt的QFile以Text純文本方式進行讀取時的學習,這兩天由於實時需要又對QFileSystemWatcher(這個類是干什么用的)進行了學習,發現也是問題很讓人頭疼.

我想監視一個文件夾(比如:"F:\QtWorkSpace")里面某些特定文件(如當天以時間戳命名的日志文件)的監視,這個文件夾里面的文件不會被刪除,只會有新的文件添加,而這些文件也只會被增加內容,那么假設我在我的QObject對象實例中定義的監視器QFileSystemWatcher命名為m_watcher,我在構造函數中的connect語句如下:

?
1
2
3
4
connect(m_watcher,SIGNAL(directoryChanged( const QString)),
this ,SLOT(on_DirectoryChanged(QString)));
connect(m_watcher,SIGNAL(fileChanged(QString)), this ,
SLOT(on_FileChanged( const QString)));

 

(on_DirectoryChanged和on_FileChangeed都是自定義的slot)首先,比如說我早上八點起床,開啟我的應用程序之后,我監視的文件就是以這個時刻的時間戳命名的日志文件(加入命名規則為<時間戳+".log":hh_mm.log>),那么這個文件名稱就是"08_00.log",在構造函數里面直接m_watcher->addPath("08_00.log").過了一會有后台程序往里面寫日志,那么在on_FileChanged函數里面我的處理是,直接把被監視的文件中所添加的內容顯示在程序的界面上,這個沒有問題.而我在on_DirectoryChanged函數里面是這樣的:首先,獲取當前的時間戳,然后通過之前文件命名規則的到一個QString newLog,我先對比這個newLog和我之前正在監視的日志文件名稱,如果一樣的話,我就什么也不做,如果不一樣,我就把之前的監視的文件從監視器里面去除掉(通過m_watcher的removePath),然后把newLog添加到監視器里面去進行監視,之前的那個文件就不管了.

於是我就想當然的這么做了,但是最后的結果卻出乎意料.

如果我在on_DirectoryChanged打上了斷點進行調試,只要我按規矩添加新的日志文件,然后往這個文件里添加新的內容,保存之后,界面上就會如我所預期的那樣把新添加的內容給顯示出來.然后呢,我就把斷電刪除點,進行同樣的文件添加和操作,卻發現什么也沒有顯示出來,我往新文件里添加的東西並沒有如我所願的被顯示出來.而查看"應用程序輸出"的時候發現,里面會輸出"添加hh_mm.log文件失敗.".

后來查看QFileSystemWatcher的CPP文件源代碼http://www.oschina.net/code/explore/qt-4.7.1/src/corelib/io/qfilesystemwatcher.cpp的時候才發現,這個類的實現有一個臨界區,於是恍然大悟.因為signal和slot這個機制不是異步的,如果我都在on_DirectoryChanged的函數體里面進行removePath和addPath兩個動作的時候,其中必然會有一個失敗而另一個成功(不考慮文件路勁不存在的情況或者是路徑已經被remove或者add的情況),所以這兩個動作只能有一個在這個函數里面執行.

所以我最后的解決辦法是,只在on_DirectoryChanged里面addPath,而在on_FileChanged里面removePath,也就是等待m_watcher對臨界區解鎖之后進行remove就行了.

http://www.oschina.net/question/658193_118503


免責聲明!

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



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