FileSystemWatcher 元件用來監視檔案系統,而當檔案系統所包含的目錄或檔案變更時,也可以利用它來回應。這讓您能夠在特定檔案或目錄被建立、修改或刪除時快速且容易啟動商務處理流程。
注:FileSystemWatcher元件是設計來監視目錄內的變更,而不是根目錄屬性本身的變更。Changed:變更目錄或檔案的大小、系統屬性、上次寫入時間、上次存取時間或安全性權限時引發。
2、FileSystemWatcher常用屬性
名稱 |
說明 |
獲取或設置一個值,該值指示是否啟用此元件。 |
|
獲取或設置篩選字串,用於確定在目錄中監視哪些檔。 |
|
獲取或設置一個值,該值指示是否監視指定路徑中的子目錄。 |
|
獲取或設置內部緩衝區的大小。 |
|
獲取或設置要監視的更改類型。 |
|
獲取或設置要監視的目錄的路徑。 |
|
獲取或設置一個物件,該物件用於封送因目錄更改而發出的事件處理程式調用。 |
3、FileSystemWatcher常用事件
名稱 |
說明 |
當更改指定 Path中的檔和目錄時發生。變更目錄或檔案的大小、系統屬性、上次寫入時間、上次存取時間或安全性權限時引發。 |
|
當在指定 Path中創建檔和目錄時發生。 |
|
刪除指定 Path中的檔或目錄時發生。 |
|
當內部緩衝區溢出時發生。 |
|
重命名指定 Path中的檔或目錄時發生。 |
4、FileSystemWatcher中Filter屬性通配符說明
篩選器字串 |
監視下列檔 |
*.* |
所有檔(預設值)。空字串 ("") 同樣監視所有檔。 |
*.txt |
具有“txt”副檔名的所有檔。 |
*recipe.doc |
檔案名以“recipe”結尾且具有“doc”副檔名的所有檔。 |
win*.xml |
檔案名以“win”開頭且具有“xml”副檔名的所有檔。 |
Sales*200?.xls |
匹配下列文件: |
MyReport.Doc |
只監視 MyReport.doc |
5、FileSystemWatcher中NotifyFilter枚舉值說明
成員名稱 |
說明 |
Attributes |
檔或檔夾的屬性。 |
CreationTime |
檔或檔夾的創建時間。 |
DirectoryName |
目錄名。 |
FileName |
檔案名。 |
LastAccess |
檔或檔夾上一次打開的日期。 |
LastWrite |
上一次向檔或檔夾寫入內容的日期。 |
Security |
檔或檔夾的安全設置。 |
Size |
文件或文件夾的大小。 |
以上可組合此枚舉的成員以監視多種更改。組合時用“|”連接。
6、使用方法:
6.1、在窗體中拖入FileSystemWatcher控制項。
6.2、設定必要屬性
6.3、設定需要用的事件
6.4、編寫事件方法
7、示例代碼:
namespace FileSystemWatcherDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
UsingFileSystemWatcher();
}
/// <summary>
/// 使用FileSystemWatcher方法
/// </summary>
void UsingFileSystemWatcher()
{
//6.2
//FileSystemWatcher:侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
//获取或设置要监视的目录的路径。
fswWatcher.Path = @"D:\upload";
//获取或设置要监视的更改类型。
fswWatcher.NotifyFilter = NotifyFilters.LastWrite|NotifyFilters.FileName|NotifyFilters.LastAccess ;
//获取或设置筛选字符串,用于确定在目录中监视哪些文件。
//此處只能監控某一種文件,不能監控件多種文件,但可以監控所有文件
fswWatcher.Filter = "*.doc";
//获取或设置一个值,该值指示是否监视指定路径中的子目录。
fswWatcher.IncludeSubdirectories = true;
#region 6.3 觸發的事件
//文件或目錄創建時事件
fswWatcher.Created += new FileSystemEventHandler(fswWatcher_Created);
//文件或目錄變更時事件
fswWatcher.Changed += new FileSystemEventHandler(fswWatcher_Changed);
//文件或目錄重命名時事件
fswWatcher.Renamed += new RenamedEventHandler(fswWatcher_Renamed);
//文件或目錄刪除時事件
fswWatcher.Deleted += new FileSystemEventHandler(fswWatcher_Deleted);
#endregion
//获取或设置一个值,该值指示是否启用此组件。
fswWatcher.EnableRaisingEvents = true;
}
#region 6.4 觸發事件的方法
/// <summary>
/// 文件或目錄創建時事件方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fswWatcher_Created(object sender, FileSystemEventArgs e)
{
MessageBox.Show("有新文件");
}
/// <summary>
/// 文件或目錄變更時事件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fswWatcher_Changed(object sender, FileSystemEventArgs e)
{
}
/// <summary>
/// 文件或目錄重命名時事件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fswWatcher_Renamed(object sender, RenamedEventArgs e)
{
}
/// <summary>
/// 文件或目錄刪除時事件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fswWatcher_Deleted(object sender, FileSystemEventArgs e)
{
}
#endregion
}
}
8.1有人想同时监控多种类型的文件,例如*.xml + *.config,发现Filter属性不支持这种设置(只能够设置一种)。这种情况下可以将Filter属性设成*.*,在事件里用if (e.FullPath.EndsWith(".xml") || e.FullPath.EndsWith(".config"))自己判断过滤一下。记得Filter属性的设置并不会减少进入缓冲区的事件通知,因此上 面的方法并不会带来多少性能损失。
8.2. BufferSize