FileSystemWatcher事件多次触发解决办法

我这里要提出的新的方法叫“检查最后更新时间法”,原理是在FileSystemWatcher事件激发时先检查更新的文件的最后更新时间是否已经被记录, 如果未被记录则激发event,否则不激发。

具体代码如下

 

1: using System;

 2: using System.Collections.Generic;

 

 3: using System.Linq;

 

 4: using System.Text;

 

 5: using System.IO;

 

 6:  

 

 7: namespace GiantSoft.Common

 

 8: {

 

 9: public class GiantFileSystemWatcher : IDisposable

 

 10: {

 

 11: private FileSystemWatcher m_Watcher;

 

 12:  

 

 13: private Dictionary<string, DateTime> m_DictUpdateTime = new Dictionary<string, DateTime>();

 

 14:  

 

 15: public GiantFileSystemWatcher(string path, string filter)

 

 16: {

 

 17: m_Watcher = new FileSystemWatcher(path, filter);

 

 18: m_Watcher.Error += new ErrorEventHandler(m_Watcher_Error);

 

 19: m_Watcher.EnableRaisingEvents = false;

 

 20: m_Watcher.IncludeSubdirectories = true;

 

 21: }

 

 22:  

 

 23: void m_Watcher_Error(object sender, ErrorEventArgs e)

 

 24: {

 

 25: LogUtil.LogError(e.GetException());

 

 26: }

 

 27:  

 

 28: public bool Start()

 

 29: {

 

 30: if (m_FileChangeHandler != null)

 

 31: {

 

 32: m_Watcher.Changed += new FileSystemEventHandler(m_Watcher_Changed);

 

 33: m_Watcher.Created += new FileSystemEventHandler(m_Watcher_Changed);

 

 34: m_Watcher.Renamed += new RenamedEventHandler(m_Watcher_Changed);

 

 35: m_Watcher.EnableRaisingEvents = true;

 

 36: return true;

 

 37: }

 

 38: else

 

 39: {

 

 40: return false;

 

 41: }

 

 42: }

 

 43:  

 

 44: void m_Watcher_Changed(object sender, FileSystemEventArgs e)

 

 45: {

 

 46: try

 

 47: {

 

 48: DateTime lastModifyTime = File.GetLastWriteTime(e.FullPath);

 

 49: DateTime prevModifyTime = DateTime.MinValue;

 

 50:  

 

 51: if (m_DictUpdateTime.TryGetValue(e.FullPath.ToLower(), out prevModifyTime))

 

 52: {

 

 53: if (lastModifyTime <= prevModifyTime)

 

 54: {

 

 55: return;

 

 56: }

 

 57: else

 

 58: {

 

 59: m_DictUpdateTime[e.FullPath.ToLower()] = lastModifyTime;

 

 60: }

 

 61: }

 

 62: else

 

 63: {

 

 64: m_DictUpdateTime[e.FullPath.ToLower()] = lastModifyTime;

 

 65: }

 

 66:  

 

 67: if (m_FileChangeHandler != null)

 

 68: {

 

 69: m_FileChangeHandler.Invoke(this, e);

 

 70: }

 

 71: }

 

 72: catch (Exception exc)

 

 73: {

 

 74: LogUtil.LogError(exc);

 

 75: }

 

 76: }

 

 77:  

 

 78: private FileSystemEventHandler m_FileChangeHandler;

 

 79:  

 

 80: public event FileSystemEventHandler FileChangeHandler

 

 81: {

 

 82: add { m_FileChangeHandler += value; }

 

 83: remove { m_FileChangeHandler -= value; }

 

 84: }

 

 85:  

 

 86: #region IDisposable Members

 

 87:  

 

 88: public void Dispose()

 

 89: {

 

 90: m_DictUpdateTime.Clear();

 

 91: m_DictUpdateTime = null;

 

 92: m_Watcher.EnableRaisingEvents = false;

 

 93: if (m_FileChangeHandler != null)

 

 94: {

 

 95: m_Watcher.Changed -= new FileSystemEventHandler(m_Watcher_Changed);

 

 96: m_Watcher.Created -= new FileSystemEventHandler(m_Watcher_Changed);

 

 97: m_Watcher.Renamed -= new RenamedEventHandler(m_Watcher_Changed);

 

 98: }

 

 99: m_Watcher.Dispose();

 

 100: }

 

 101:  

 

 102: #endregion

 

 103: }

 

 104: }

 

此代码为复制前人代码,感谢牛人解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

感谢一路走过的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值