我这里要提出的新的方法叫“检查最后更新时间法”,原理是在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: }
此代码为复制前人代码,感谢牛人解决。