他是用VB當範例,正巧我很久沒寫C#了,想說就用C#寫個簡單的版本來玩
下面是寫好的範例
跟PCADV上的不同,我簡化了不少功能
要做到檔案系統監控,.NET平台有提供FileSystemWatcher這個物件來替我們簡單辦到,他是在System.IO之下
他有幾個比較重要的屬性
- Path:設定或得到監控的目錄
- EnableRaisingEvents:開始或停止監控
- IncludeSubdirectories:是否監控子目錄
之後比較重要的幾個事件
- Created:檔案或目錄被創造
- Deleted:檔案或目錄被刪除
- Renamed:檔案或目錄被重新命名
- 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 則留言:
very good blog, congratulations
regard from Reus Catalonia Spain
thank you
張貼留言