2009年6月5日 星期五

監控檔案系統-FileSystemWatcher

這是本期PCADV上的一篇文章,說為了防止木馬,可以寫一個監控檔案是否有更改系統
他是用VB當範例,正巧我很久沒寫C#了,想說就用C#寫個簡單的版本來玩

下面是寫好的範例

跟PCADV上的不同,我簡化了不少功能

要做到檔案系統監控,.NET平台有提供FileSystemWatcher這個物件來替我們簡單辦到,他是在System.IO之下

他有幾個比較重要的屬性
  1. Path:設定或得到監控的目錄
  2. EnableRaisingEvents:開始或停止監控
  3. IncludeSubdirectories:是否監控子目錄


之後比較重要的幾個事件
  1. Created:檔案或目錄被創造
  2. Deleted:檔案或目錄被刪除
  3. Renamed:檔案或目錄被重新命名
  4. Changed:檔案或目錄被更動

這邊比較值的一提的是,我直接用

FileSystemWatcher fsw=new FileSystemWatcher();
fsw.Created += new FileSystemEventHandler(fsw_Created);//指派事件監聽
....
void fsw_Created(object sender, FileSystemEventArgs e)
{
this.textbox1.Text+=e.FullPath + " 檔案被創造";
}


會丟出InvalidOperationException 這樣的例外,會發生是因為企圖對Windows Form 的控制項使用不同執行緒來控制,MSDN有提供解套方法
http://msdn.microsoft.com/zh-tw/library/ms171728.aspx

可以使用Form的Invoke函式去發起一個委託,來達到安全執行緒的要求
簡單的範例

delegate void SetTextCallback(string text);//宣告一個委託的函式
SetTextCallback d;
....
public Form1()
{
......
fsw = new FileSystemWatcher();
fsw.Created += new FileSystemEventHandler(fsw_Created);
fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
d = new SetTextCallback(setText);//設定委託函式
}
...
private void setText(string text)
{
this.listView1.Items.Add(new ListViewItem(text));
//被委託函式實際要做的內容,在此我用ListView取代TextBox

}
...
void fsw_Created(object sender, FileSystemEventArgs e)
{
string currentMessage = e.FullPath + " 檔案被創造";
this.Invoke(d, new object[] { currentMessage });//要求委託函式

}


-----------------
這邊題外話
Eclipse用久了,他都會自動幫我import要用的函式庫,就算他沒幫我import
我也可以Ctrl+Shift+M去自動import
Visual Studio沒了這動作熊熊不習慣,就稍微找了一下有沒有類似的功能
就找到了類似的東西

C#自動using的方法
首先在不知道要using什麼類別下按滑鼠右鍵(在此我用Thread),之後選"解析",就可以看到要using的東西了

1 則留言:

Jobove - Reus 提到...

very good blog, congratulations
regard from Reus Catalonia Spain
thank you