//************************************************************************
// 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();
}
}
}
}
}
}