FileSystemWatcher控件主要功能:
監控指定檔案或目錄的檔案的建立、删除、改動、重命名等活動。可以動态地定義需要監控的檔案類型及檔案屬性改動的類型。
1.常用的幾個基本屬性:
(1) Path :設定要監視的目錄的路徑。
(2) IncludeSubdirectories :設定是否級聯監視指定路徑中的子目錄。
(3) Filter :設定篩選字元串,用于确定在目錄中監視哪些類型的檔案。
(4) NotifyFilter :設定檔案的哪些屬性的變動會觸發Changed事件,同時監控多個屬性變動可以按“或”組合。(預設值為 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName 組合)
子項: Attributes -- 檔案或檔案夾的屬性。
CreationTime -- 檔案或檔案夾的建立時間。
DirectoryName -- 目錄名。(常用)
FileName -- 檔案名。 (常用)
LastAccess -- 檔案或檔案夾上一次打開的日期。
LastWrite -- 上一次向檔案或檔案夾寫入内容的日期。
Security -- 檔案或檔案夾的安全設定。
Size -- 檔案或檔案夾的大小。 (常用)
(5) EnableRaisingEvents :設定是否開始監控。(預設為false)
2.常用事件:
(1) Changed :當更改檔案和目錄時發生,可以通過NotifyFilter屬性設定觸發該事件的需要檔案更改的屬性。
(2) Created : 當建立檔案和目錄時發生。
(3) Deleted : 删除檔案或目錄時發生。
(4) Renamed :重命名檔案或目錄時發生。
(5) FileSystemEventArgs 對象:
成員:Name: 擷取受影響的檔案或目錄的名稱。 注意:如果是級聯監控子目錄的話,該值為從監控目錄的下個目錄到受影響的檔案的路徑,而不隻是受影響的檔案名。
FullPath : 擷取受影響的檔案或目錄的完全限定的路徑。
ChangeType :擷取受影響的檔案或目錄的發生的事件類型。
子項:All -- 檔案或檔案夾的建立、删除、更改或重命名。
Changed -- 檔案或檔案夾的更改。更改的類型包括大小、屬性、安全設定、最近寫入時間和最近通路時間方面的更改。
Created -- 檔案或檔案夾的建立。
Deleted -- 檔案或檔案夾的删除。
Renamed -- 檔案或檔案夾的重命名。
(6) RenamedEventArgs 對象:
成員:Name: 擷取受影響的檔案或目錄的新名稱。
OldName : 擷取受影響的檔案或目錄的舊名稱。
FullPath : 擷取受影響的檔案或目錄的完全限定的路徑。
OldFullPath : 擷取受影響的檔案或目錄的前一個完全限定的路徑。
ChangeType :擷取受影響的檔案或目錄的發生的事件類型。
子項:All -- 檔案或檔案夾的建立、删除、更改或重命名。
Changed -- 檔案或檔案夾的更改。更改的類型包括大小、屬性、安全設定、最近寫入時間和最近通路時間方面的更改。
Created -- 檔案或檔案夾的建立。
Deleted -- 檔案或檔案夾的删除。
Renamed -- 檔案或檔案夾的重命名。
示範源碼:
private delegate void setLogTextDelegate(FileSystemEventArgs e); //聲明傳遞FileSystemEventArgs對象的委托,用于檔案Created,Deleted和Changed變動時更新UI界面。
private delegate void renamedDelegate(RenamedEventArgs e); //聲明傳遞RenamedEventArgs對象的委托,用于檔案Renamed時更新UI界面。
FileSystemWatcher fsw= new FileSystemWatcher();
fsw.Path = “C:\\”; //設定監控的檔案目錄
fsw.IncludeSubdirectories = true; //設定監控C槽目錄下的所有子目錄
fsw.Filter = "*.txt|*.doc|*.jpg"; //設定監控檔案的類型
fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; //設定檔案的檔案名、目錄名及檔案的大小改動會觸發Changed事件
fsw.Created += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle); //綁定事件觸發後處理資料的方法。
fsw.Deleted += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle);
fsw.Changed += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle);
fsw.Renamed += new RenamedEventHandler(this.fileSystemWatcher_Renamed); //重命名事件與增删改傳遞的參數不一樣。
fsw.EnableRaisingEvents = true; //啟動監控
private void fileSystemWatcher_EventHandle(object sender, FileSystemEventArgs e) //檔案增删改時被調用的處理方法
{
if (this.listView1.InvokeRequired) //判斷是否跨線程
{
this.listView1.Invoke(new setLogTextDelegate(setLogText), new object[] { e }); //使用委托将方法封送到UI主線程處理
}
}
private void fileSystemWatcher_Renamed(object sender,RenamedEventArgs e) //檔案重命名時被調用的處理方法
{
if (this.listView1.InvokeRequired) //判斷是否跨線程
{
this.listView1.Invoke(new renamedDelegate(setRenamedLogText), new object[] { e }); //使用委托将方法封送到UI主線程處理
}
}
private void setLogText(FileSystemEventArgs e) //更新UI界面
{
ListViewItem lvi = new ListViewItem();
lvi.SubItems.Add(e.Name); //受影響的檔案名
lvi.SubItems.Add(e.ChangeType.ToString()); //受影響檔案的變動類型(可能為Created、Changed、Deleted)
lvi.SubItems.Add(e.FullPath); //受影響的檔案完整路徑
this.listView1.Items.Add(lvi);
}
private void setRenamedLogText(RenamedEventArgs e) //更新UI界面
{
ListViewItem lvi = new ListViewItem();
lvi.SubItems.Add(e.OldName); //受影響的檔案的原名
lvi.SubItems.Add(e.ChangeType.ToString()); //受影響的檔案的改動類型(Rename)
lvi.SubItems.Add(e.Name); //受影響的檔案的新名
lvi.SubItems.Add(e.OldFullPath); //受影響的檔案的原路徑
lvi.SubItems.Add(e.FullPath); //受影響的檔案的完整路徑(其實和原路徑一樣)
this.fileEventLog_lvw.Items.Add(lvi);
}
重點:
1.、因為FileSystemWatcher類本身就是多線程的控件,也就是每執行個體化一個FileSystemWatcher自動就會建立一條線程。
2、我們需要利用委托進行跨線程更新UI界面,因為重命名事件傳遞的是RenameEventArgs對象,而建立、修改、删除事件傳遞的是FileEventArgs對象,是以需要聲明兩個委托。
3、如果需要同時監控多個檔案(如監控系統全盤),隻需要建立FileSystemWatcher數組,每個檔案用一個FileSystemWatcher進行監控。
執行個體效果: