作者peanut97 (花生)
看板Soft_Job
標題[請益] 如何監控某個資料夾內檔案是否變動
時間Tue Sep 3 18:10:07 2013
因工作上需要,要寫個程式,指定某個資料夾後,
便能監看資料夾(包含子資料夾)裡所有檔案,如果有發生新增、刪除、重新命名、重新被
寫入,就列出來。
方法1:
參考:
http://www.openfoundry.org/tw/tech-column/8109--integrit-
一開始先走訪整個資料夾(包含子資料等),將走訪完的資料結構存成資料檔1。再把資料
檔1做hash,產生一個key1
途中某個檔案有變動
20秒後再重新走訪整個資料夾,存成資料檔2,再把資料檔2做hash,產生key2。
把key1比對key2。如有不同,表示在20秒內有檔案變動。比較資料檔1跟資料檔2,看哪裡
不一樣,再列出來。
缺點:這樣好像很慢,走訪整個C糟,執行到一半就爆了(stack overflow?)。產生出來的
資料檔一定很大。更何況資料檔1跟資料檔2還要比較。
方法2:
參考.Net Framework 的函數(FileSystemWatcher 類別):
http://msdn.microsoft.com/zh-tw/library/System.IO.FileSystemWatcher.aspx
使用方式:
http://www.dotblogs.com.tw/jaigi/archive/2012/10/03/75258.aspx
簡單來說就是設定好指定的資料夾,當資料夾裡面的檔案有變動,就會自動存到他的資
料結構裡,我們再列出來即可。
優點:很快
缺點:他怎麼做的??
請問
我在網路上看到一個程式:Directory Monitor
中文簡介:
http://briian.com/?p=8240
官網下載處:
http://www.deventerprise.net/DirectoryMonitor
在官網下載處最下面系統需求要「.NET Framework 4.0」
是表示,這個程式是使用了.net framework 4.0的函數嗎?也就是說他可能使用了方法2
的FileSystemWatcher 類別
所以才這麼快。
因為自己在新人訓練期,被要求寫這個程式,再報告複雜度。
所以需要自己實作。想請教這裡各位大大,怎麼最佳化?
方法1,每隔一段時間對資料夾做快照(snapshot)再比較。但是要怎麼加速?
方法2,好像是監控作業系統,當有檔案變動的事件(event)發生,再記錄。感覺這個比較合理,不浪
費時間做snapshot,但是他是怎麼做的呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.248.161.28
※ 編輯: peanut97 來自: 60.248.161.28 (09/03 18:11)
→ RouterHsieh:我對windows不熟,但有辦法捕捉硬碟發生IO時的訊號嗎 09/03 18:38
→ RouterHsieh:或者是File System有發生變動時,OS那邊應該會知道吧 09/03 18:39
→ peanut97:很謝謝大家幫忙提供解法 原本有點怕被罵工作要自己做等等 09/03 22:39
→ peanut97:大家講的都好酷 我來好好研究看看!! 09/03 22:40
推 dennis2030:Qt也有FileSystemWatcher之類的東西 09/03 23:24
推 chiel:如果是linux 有inotify()可以用 09/04 01:20
推 chiel:kernel要是2.6.x以上 09/04 01:23
推 chucheng:微軟有提供範例(FileSystemWatcher) 09/04 06:06
→ markov:你跟光要答案的不同 你自己心裡明白XD 這就是差異 09/05 19:59
推 psliurt:這方法已經有人拿來做產品了 09/07 01:00