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屬性拜訪文件變革新聞,同時也能夠設置其能否須要將數據耐久化到磁盤文件中。