天天看點

FileSystemWatcher使用方法

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進行監控。

執行個體效果: