//************************************************************************ // https://github.com/yuzhengyang // author: yuzhengyang // date: 2017.6.28 - 2017.6.29 // desc: 文件变更监测 // Copyright (c) yuzhengyang. All rights reserved. //************************************************************************ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Y.Utils.DataUtils.Collections; namespace Y.Utils.IOUtils.FileManUtils { /// /// 文件更改通知 /// public class FileWatcher : IDisposable { /// /// 接受文件监控信息的事件委托 /// /// /// public delegate void FileWatcherEventHandler(object sender, FileWatcherEventArgs args); /// /// 获取文件监控信息 /// public FileWatcherEventHandler eventHandler; private bool _IsStart = false, _IsDisposed = false; private List Watchers = new List(); /// /// 当前运行状态 /// public bool IsStart { get { return _IsStart; } } public FileWatcher() { //DriveInfo[] drives = DriveInfo.GetDrives().Where(x => x.IsReady && (x.DriveType == DriveType.Fixed || x.DriveType == DriveType.Removable)).ToArray(); //if (ListTool.HasElements(drives)) //{ // foreach (var d in drives) // { // //if (d.Name.Contains("C")) continue; // FileSystemWatcher fsw = new FileSystemWatcher(d.Name); // fsw.Created += CreatedEvent;//创建文件或目录 // fsw.Changed += ChangedEvent;//更改文件或目录 // fsw.Deleted += DeletedEvent;//删除文件或目录 // fsw.Renamed += RenamedEvent;//重命名文件或目录 // fsw.Error += ErrorEvent; // fsw.IncludeSubdirectories = true; // fsw.NotifyFilter = (NotifyFilters)383; // Watchers.Add(fsw); // } //} } public FileWatcher(string[] paths) { if (ListTool.HasElements(paths)) { foreach (var p in paths) { Add(p); } } } public void Add(string path, bool start = false) { FileSystemWatcher fsw = new FileSystemWatcher(path); fsw.Created += CreatedEvent;//创建文件或目录 fsw.Changed += ChangedEvent;//更改文件或目录 fsw.Deleted += DeletedEvent;//删除文件或目录 fsw.Renamed += RenamedEvent;//重命名文件或目录 fsw.Error += ErrorEvent; fsw.IncludeSubdirectories = true; fsw.NotifyFilter = (NotifyFilters)383; if (start) fsw.EnableRaisingEvents = start; Watchers.Add(fsw); } public void Remove(string path) { for (int i = Watchers.Count - 1; i >= 0; i--) { if (Watchers[i].Path == path) { Watchers[i].EnableRaisingEvents = false; Watchers[i].Dispose(); Watchers.RemoveAt(i); } } } /// /// 启动文件监测 /// public void Start() { if (!_IsDisposed) { _IsStart = true; if (ListTool.HasElements(Watchers)) { foreach (var w in Watchers) { w.EnableRaisingEvents = true; } } } } /// /// 停止文件监测 /// public void Stop() { if (!_IsDisposed) { _IsStart = false; if (ListTool.HasElements(Watchers)) { foreach (var w in Watchers) { w.EnableRaisingEvents = false; } } } } private void DriveMonitor() { //监测磁盘的插入拔出 } private void CreatedEvent(object sender, FileSystemEventArgs e) { eventHandler?.Invoke(sender, new FileWatcherEventArgs(e.ChangeType, e.FullPath, Path.GetFileName(e.FullPath), null, null)); } private void ChangedEvent(object sender, FileSystemEventArgs e) { eventHandler?.Invoke(sender, new FileWatcherEventArgs(e.ChangeType, e.FullPath, Path.GetFileName(e.FullPath), null, null)); } private void DeletedEvent(object sender, FileSystemEventArgs e) { eventHandler?.Invoke(sender, new FileWatcherEventArgs(e.ChangeType, e.FullPath, Path.GetFileName(e.FullPath), null, null)); } private void RenamedEvent(object sender, RenamedEventArgs e) { eventHandler?.Invoke(sender, new FileWatcherEventArgs(e.ChangeType, e.FullPath, Path.GetFileName(e.FullPath), e.OldFullPath, e.OldName)); } private void ErrorEvent(object sender, ErrorEventArgs e) { } public void Dispose() { if (!_IsDisposed) { _IsStart = false; _IsDisposed = true; if (ListTool.HasElements(Watchers)) { foreach (var w in Watchers) { w.EnableRaisingEvents = false; w.Dispose(); } } } } } }