有一個軟體,每12秒向一個目錄下的某個檔案做WriteFile操作,先在一個偏移位置WriteFile一個遞增的時間戳,再在之后的偏移位置WriteFile其它內容,最后呼叫 FlushFileBuffer ,這樣一分鐘寫5次。用process monitor監控后,如下圖所示:

紅框部分是寫遞增的時間戳操作
我的任務是監控這個軟體對這個目錄下的這個檔案的每一次更新,然后決議檔案內容,發送出去。
我用的API是 ReadDirectoryChangesW()結合完成例程,來監控這個目錄下的這個檔案,若這個目錄下的檔案更新就回應完成例程(回呼函式),
具體使用的方法,參考了很多例子,應該問題不大,同時回呼函式回應的次數也是一分鐘五次,這個也沒問題,也就是說檔案的變化,都監控到了
那個軟體每次在檔案的一個位置寫入遞增的時間戳,正常應該是
...
第N次檔案變化回應,然后讀檔案,讀到的其中的時間戳是 20180503143009
第N+1次檔案變化回應,然后讀檔案,讀到的時間戳是 20180503143021
...
但總出現
...
第N次檔案變化回應,然后讀檔案,讀到的其中的時間戳是 20180503143009
第N+1次檔案變化回應,然后讀檔案,讀到的時間戳是 20180503143009
...
或者
...
第N次檔案變化回應,然后讀檔案,讀到的其中的時間戳是 20180503143021
第N+1次檔案變化回應,然后讀檔案,讀到的時間戳是 20180503143021
...
也就是說,每監控到一次檔案改變后,我去讀這個檔案內容中的的時間戳部分,時間戳應該是遞增的。按理說,監控到檔案改變后,之前的寫操作應該都flush到磁盤了,不應該出現上述情況。
我懷疑是不是 這個ReadDirectoryChangesW()的機制,頂多是只能通知到檔案的變化,但并不保證,在收到回呼通知后,內容是否徹底被FlushFileBuffer到了磁盤。
請問 大家對這塊有好的建議嗎?
uj5u.com熱心網友回復:
建議直接Hook 這幾個APIuj5u.com熱心網友回復:
目前領導沒考慮換其它方案,鉤子程式還不太熟悉,而且我自己模擬那個寫的軟體,也沒出現這樣的問題。
uj5u.com熱心網友回復:
MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl參考里面的例子fwatch:
MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.DSP
MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.C
MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\MAKEFILE
MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.INI
MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\README.TXT
uj5u.com熱心網友回復:
這里的方法也是用的 ReadDirectoryChangesW 嗎?
uj5u.com熱心網友回復:
試了一下這個例子,還是出現這個問題。
uj5u.com熱心網友回復:
FDump - Dumping File Sectors Directly from Disk using Logical Offsets http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usinuj5u.com熱心網友回復:
WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/uj5u.com熱心網友回復:
是一些讀取磁盤實際扇區的方法,達不到事件通知的效果。
這個有些復雜,其中的MonitoringFileBuilder這個硬是沒弄明白怎么用

不是我不深入研究,而是時間緊同時要求上必須用事件通知的方式,因為之前有同事用PYTHON實作了這個功能,沒出現類似問題,因此組織上也想通過
這種事件通知的方式來實作。
您知道為什么python的檔案變化通知功能沒有這個問題嗎? 您看還有別的方法推薦嗎?
uj5u.com熱心網友回復:
python的檔案通知難道不是呼叫Windows API實作的嗎?用API Monitor監視Python是怎么呼叫Windows API實作的。
uj5u.com熱心網友回復:
如果某次讀到的內容,和上次一樣,就關閉檔案,重新打開,再讀,重試幾次轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/69996.html
標籤:進程/線程/DLL
下一篇:求matlab閾值影像處理程式
