程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#應用filesystemwatcher及時監控文件目次的添加和刪除

c#應用filesystemwatcher及時監控文件目次的添加和刪除

編輯:C#入門知識

c#應用filesystemwatcher及時監控文件目次的添加和刪除。本站提示廣大學習愛好者:(c#應用filesystemwatcher及時監控文件目次的添加和刪除)文章只能為提供參考,不一定能成為您想要的結果。以下是c#應用filesystemwatcher及時監控文件目次的添加和刪除正文


起首,我們須要對.net供給的FileSystemWatcher類有所懂得。我有些懶,找了MSDN對該類的描寫。

FileSystemWatcher類偵聽文件體系更改告訴,並在目次或目次中的文件產生更改時激發事宜。

應用 FileSystemWatcher 監督指定目次中的更改。可監督指定目次中的文件或子目次的更改。可以創立一個組件來監督當地盤算機、收集驅動器或長途盤算機上的文件。

若要監督一切文件中的更改,請將 Filter 屬性設置為空字符串 ("") 或應用通配符(“*.*”)。若要監督特定的文件,請將 Filter 屬性設置為該文件名。例如,若要監督文件 MyDoc.txt 中的更改,請將 Filter 屬性設置為“MyDoc.txt”。也能夠監督特定類型文件中的更改。例如,若要監督文本文件中的更改,請將 Filter 屬性設置為“*.txt”。

可監督目次或文件中的若干種更改。例如,可監督文件或目次的 Attributes、LastWrite 日期和時光或 Size 方面的更改。經由過程將 NotifyFilter 屬性設置為 NotifyFilters 值之一來到達此目標。有關可監督的更改類型的更多信息,請拜見 NotifyFilters。

可監督文件或目次的重定名、刪除或創立。例如,若要監督文本文件的重定名,請將 Filter 屬性設置為“*.txt”,並應用為其參數指定的 Renamed 來挪用 WaitForChanged 辦法。

Windows 操作體系在 FileSystemWatcher 創立的緩沖區中告訴組件文件產生更改。假如短時光內有許多更改,則緩沖區能夠會溢出。這將招致組件掉去對目次更改的跟蹤,而且它將只供給普通性告訴。應用 InternalBufferSize 屬性來增長緩沖區年夜小的開支較年夜,由於它來自沒法換出到磁盤的非頁面內存,所以應確保緩沖區年夜小適中(盡可能小,但也要有足夠年夜小以便不會喪失任何文件更改事宜)。若要防止緩沖區溢出,請應用 NotifyFilter 和 IncludeSubdirectories 屬性,以即可以挑選失落不想要的更改告訴。

應用 FileSystemWatcher 類時,請留意以下事項。

1) 對包含隱蔽文件(夾)在內的一切文件(夾)停止監控。

2) 您可認為 InternalBufferSize 屬性(用於監督收集上的目次)設置的最年夜年夜小為 64 KB。

FileSystemWatcher的實例監控到文件(夾)的變更後,會觸發響應的事宜,個中文件(夾)的添加,刪除和修正會分離觸發Created,Deleted,Changed事宜,文件(夾)重定名時觸發OnRenamed事宜。

然後,在熟習了FileSystemWatcher類後,我們開端本身的法式編寫。

實例化FileSystemWatcher類,並傳入須要監控的目次途徑,和能否制訂監控的文件類型(文章後面有所引見)。


_watcher = new FileSystemWatcher(_path, _filter);

注冊監聽事宜,和編寫事宜觸發後相干的處置邏輯。


_watcher.Created += new FileSystemEventHandler(OnChanged);
            _watcher.Changed += new FileSystemEventHandler(OnChanged);
            _watcher.Deleted += new FileSystemEventHandler(OnChanged);
            _watcher.Renamed += new RenamedEventHandler(OnRenamed);
            _watcher.IncludeSubdirectories = true;
            _watcher.EnableRaisingEvents = true;

在本法式中,專門界說了一個FileChangeInformation類來記載文件變更信息,並界說了一個CustomQueue類,該類相似於Queue類,是一個數據先輩先出的聚集,用來存儲一切的文件變更新聞,並供給數據耐久化功效。

監控類 - FileWatcher,代碼以下:


/// <summary>
    /// 文件監控類,用於監控指定目次下文件和文件夾的變更
    /// </summary>
    public class FileWatcher
    {
        private FileSystemWatcher _watcher = null;
        private string _path = string.Empty;
        private string _filter = string.Empty;
        private bool _isWatch = false;
        private CustomQueue<FileChangeInformation> _queue = null;

        /// <summary>
        /// 監控能否正在運轉
        /// </summary>
        public bool IsWatch
        {
            get
            {
                return _isWatch;
            }
        }

        /// <summary>
        /// 文件變革信息隊列
        /// </summary>
        public CustomQueue<FileChangeInformation> FileChangeQueue
        {
            get
            {
                return _queue;
            }
        }

        /// <summary>
        /// 初始化FileWatcher類
        /// </summary>
        /// <param name="path">監控途徑</param>
        public FileWatcher(string path)
        {
            _path = path;
            _queue = new CustomQueue<FileChangeInformation>();
        }
        /// <summary>
        /// 初始化FileWatcher類,並指定能否耐久化文件變革新聞
        /// </summary>
        /// <param name="path">監控途徑</param>
        /// <param name="isPersistence">能否耐久化變革新聞</param>
        /// <param name="persistenceFilePath">耐久化保留途徑</param>
        public FileWatcher(string path, bool isPersistence, string persistenceFilePath)
        {
            _path = path;
            _queue = new CustomQueue<FileChangeInformation>(isPersistence, persistenceFilePath);
        }

        /// <summary>
        /// 初始化FileWatcher類,並指定能否監控指定類型文件
        /// </summary>
        /// <param name="path">監控途徑</param>
        /// <param name="filter">指定類型文件,格局如:*.txt,*.doc,*.rar</param>
        public FileWatcher(string path, string filter)
        {
            _path = path;
            _filter = filter;
            _queue = new CustomQueue<FileChangeInformation>();
        }

        /// <summary>
        /// 初始化FileWatcher類,並指定能否監控指定類型文件,能否耐久化文件變革新聞
        /// </summary>
        /// <param name="path">監控途徑</param>
        /// <param name="filter">指定類型文件,格局如:*.txt,*.doc,*.rar</param>
        /// <param name="isPersistence">能否耐久化變革新聞</param>
        /// <param name="persistenceFilePath">耐久化保留途徑</param>
        public FileWatcher(string path, string filter, bool isPersistence, string persistenceFilePath)
        {
            _path = path;
            _filter = filter;
            _queue = new CustomQueue<FileChangeInformation>(isPersistence, persistenceFilePath);
        }

        /// <summary>
        /// 翻開文件監聽器
        /// </summary>
        public void Open()
        {
            if (!Directory.Exists(_path))
            {
                Directory.CreateDirectory(_path);
            }

            if (string.IsNullOrEmpty(_filter))
            {
                _watcher = new FileSystemWatcher(_path);
            }
            else
            {
                _watcher = new FileSystemWatcher(_path, _filter);
            }
            //注冊監聽事宜
            _watcher.Created += new FileSystemEventHandler(OnProcess);
            _watcher.Changed += new FileSystemEventHandler(OnProcess);
            _watcher.Deleted += new FileSystemEventHandler(OnProcess);
            _watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
            _watcher.IncludeSubdirectories = true;
            _watcher.EnableRaisingEvents = true;
            _isWatch = true;
        }

        /// <summary>
        /// 封閉監聽器
        /// </summary>
        public void Close()
        {
            _isWatch = false;
            _watcher.Created -= new FileSystemEventHandler(OnProcess);
            _watcher.Changed -= new FileSystemEventHandler(OnProcess);
            _watcher.Deleted -= new FileSystemEventHandler(OnProcess);
            _watcher.Renamed -= new RenamedEventHandler(OnFileRenamed);
            _watcher.EnableRaisingEvents = false;
            _watcher = null;
        }

        /// <summary>
        /// 獲得一條則件變革新聞
        /// </summary>
        /// <returns></returns>
        public FileChangeInformation Get()
        {
            FileChangeInformation info = null;
            if (_queue.Count > 0)
            {
                lock (_queue)
                {
                    info = _queue.Dequeue();
                }
            }
            return info;
        }

        /// <summary>
        /// 監聽事宜觸發的辦法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnProcess(object sender, FileSystemEventArgs e)
        {
            try
            {
                FileChangeType changeType = FileChangeType.Unknow;
                if (e.ChangeType == WatcherChangeTypes.Created)
                {
                    if (File.GetAttributes(e.FullPath) == FileAttributes.Directory)
                    {
                        changeType = FileChangeType.NewFolder;
                    }
                    else
                    {
                        changeType = FileChangeType.NewFile;
                    }
                }
                else if (e.ChangeType == WatcherChangeTypes.Changed)
                {
                    //部門文件創立時異樣觸發文件變更事宜,此時記載變更操作沒成心義
                    //假如
                    if (_queue.SelectAll(
                        delegate(FileChangeInformation fcm)
                        {
                            return fcm.NewPath == e.FullPath && fcm.ChangeType == FileChangeType.Change;
                        }).Count<FileChangeInformation>() > 0)
                    {
                        return;
                    }

                    //文件夾的變更,只針對創立,重定名和刪除舉措,修正不做任何操作。
                    //由於文件夾下任何變更異樣會觸發文件的修正操作,沒有任何意義.
                    if (File.GetAttributes(e.FullPath) == FileAttributes.Directory)
                    {
                        return;
                    }

                    changeType = FileChangeType.Change;
                }
                else if (e.ChangeType == WatcherChangeTypes.Deleted)
                {
                    changeType = FileChangeType.Delete;
                }

                //創立新聞,並壓入隊列中
                FileChangeInformation info = new FileChangeInformation(Guid.NewGuid().ToString(), changeType, e.FullPath, e.FullPath, e.Name, e.Name);
                _queue.Enqueue(info);
            }
            catch
            {
                Close();
            }
        }

        /// <summary>
        /// 文件或目次重定名時觸發的事宜
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnFileRenamed(object sender, RenamedEventArgs e)
        {
            try
            {
                //創立新聞,並壓入隊列中
                FileChangeInformation info = new FileChangeInformation(Guid.NewGuid().ToString(), FileChangeType.Rename, e.OldFullPath, e.FullPath, e.OldName, e.Name);
                _queue.Enqueue(info);
            }
            catch
            {
                Close();
            }
        }
    }

最初,功效挪用以下:


//初始化監控器
                FileWatcher watcher = new FileWatcher(@"D:\");
                watcher.Open();

                FileChangeInformation fci = null;
                //獲得新聞
                while (true)
                {
                    //假如IsWatch為False,則能夠監控外部產生異常終止了監控,須要從新開啟監控
                    if (watcher.IsWatch)
                    {
                        //隊列頂真個變革新聞
                        fci = watcher.Get();
                        //處置新聞的代碼
                        //Print(fci);
                    }
                    else
                    {
                        watcher.Open();
                    }
                    Thread.Sleep(1000);
                }

該法式完成了對文件目次下一切子目次和子文件的變更停止監控,並可經由過程FileChangeQueue屬性拜訪文件變革新聞,同時也能夠設置其能否須要將數據耐久化到磁盤文件中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved