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、FileSystemWatcher中Filter屬性通配符說明


篩選器字串



監視下列檔



*.*



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



*.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、FileSystemWatcher中NotifyFilter枚舉值說明


成員名稱



說明



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.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短文件名方式表示。