阿宽

Nothing is more powerful than habit!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

c# FileSystemWatcher控件的使用方法

Posted on 2008-05-09 09:13  宽田  阅读(9902)  评论(3编辑  收藏  举报
1、FileSystemWatcher用途:

    FileSystemWatcher 元件用來監視檔案系統,而當檔案系統所包含的目錄或檔案變更時,也可以利用它來回應。這讓您能夠在特定檔案或目錄被建立、修改或刪除時快速且容易啟動商務處理流程。
     注:FileSystemWatcher元件是設計來監視目錄內的變更,而不是根目錄屬性本身的變更。Changed:變更目錄或檔案的大小、系統屬性、上次寫入時間、上次存取時間或安全性權限時引發。


2、FileSystemWatcher常用屬性

名稱

說明

EnableRaisingEvents

獲取或設置一個值,該值指示是否啟用此元件。

Filter

獲取或設置篩選字串,用於確定在目錄中監視哪些檔。

IncludeSubdirectories

獲取或設置一個值,該值指示是否監視指定路徑中的子目錄。

InternalBufferSize

獲取或設置內部緩衝區的大小。

NotifyFilter

獲取或設置要監視的更改類型。

Path

獲取或設置要監視的目錄的路徑。

SynchronizingObject

獲取或設置一個物件,該物件用於封送因目錄更改而發出的事件處理程式調用。


3、FileSystemWatcher常用事件

名稱

說明

Changed

當更改指定 Path中的檔和目錄時發生。變更目錄或檔案的大小、系統屬性、上次寫入時間、上次存取時間或安全性權限時引發。

Created

當在指定 Path中創建檔和目錄時發生。

Deleted

刪除指定 Path中的檔或目錄時發生。

Error

當內部緩衝區溢出時發生。

Renamed

重命名指定 Path中的檔或目錄時發生。


4、FileSystemWatcherFilter屬性通配符說明

篩選器字串

監視下列檔

*.*

所有檔(預設值)。空字串 ("") 同樣監視所有檔。

*.txt

具有“txt”副檔名的所有檔。

*recipe.doc

檔案名以“recipe”結尾且具有“doc”副檔名的所有檔。

win*.xml

檔案名以“win”開頭且具有“xml”副檔名的所有檔。

Sales*200?.xls

匹配下列文件:
Sales July 2001.xls
、Sales Aug 2002.xls、Sales March 2004.xls
但不匹配:
Sales Nov 1999.xls

MyReport.Doc

只監視 MyReport.doc


5、FileSystemWatcherNotifyFilter枚舉值說明

成員名稱

說明

Attributes

檔或檔夾的屬性。 

CreationTime

檔或檔夾的創建時間。 

DirectoryName

目錄名。 

FileName

檔案名。 

LastAccess

檔或檔夾上一次打開的日期。 

LastWrite

上一次向檔或檔夾寫入內容的日期。 

Security

檔或檔夾的安全設置。 

Size

文件或文件夾的大小。 

    以上可組合此枚舉的成員以監視多種更改。組合時用“|”連接。

6、使用方法:
    6.1、在窗體中拖入FileSystemWatcher控制項。
    6.2、設定必要屬性
    6.3、設定需要用的事件
    6.4、編寫事件方法

7、示例代碼:

using System.IO;

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、其它說明 :(轉自:http://www.cnblogs.com/RicCC/archive/2006/12/16/FileSystem-Watcher.html)
    8.1有人想同时监控多种类型的文件,例如*.xml + *.config,发现Filter属性不支持这种设置(只能够设置一种)。这种情况下可以将Filter属性设成*.*,在事件里用if (e.FullPath.EndsWith(".xml") || e.FullPath.EndsWith(".config"))自己判断过滤一下。记得Filter属性的设置并不会减少进入缓冲区的事件通知,因此上 面的方法并不会带来多少性能损失。
   8.2. BufferSize
    Windows操作系统使用FileSystemWatcher创建的一个内存缓冲区通知程序文件的修改信息,如果在很短的时间内有非常多的文件修改,这 个缓冲区会溢出, 造成部分追踪丢失,并且FileSystemWatcher不会产生异常。加大InternalBufferSize属性值可以避免这 种情况。
    InternalBufferSize默认值是8K,可以设置的最小值是4K,增加或减小InternalBufferSize最好用4K的整数倍。每一 个事件通知需要使用16字节,并不包含文件名。InternalBufferSize的内存来自non-paged内存,注意这部分内存资源比较宝贵。
    使用NotifyFilter、IncludeSubdirectories属性减小trace范围,设置filter属性并不会影响进入缓冲区的事件通知,另外尽快的完成事件处理,也是避免缓冲区溢出造成事件丢失的一个措施。
    8.3. 隐藏文件也会监控
    8.4 有些系统中,FileSystemWatcher的事件里对长文件名使用8.3短文件名方式表示。