LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#使用延迟的FileSystemWatcher来避免重复触发事件

admin
2023年12月26日 22:57 本文热度 682

问题:

  程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理;但在实际处理中发现当一个文件产生变化时,Change事件被反复触发了好几次。这样可能的结果是造成同一文件的重复处理。

解决方法:

  针对上面的问题,于是写了一个可以延迟FileSystemWatcher发出的事件的Class DelayFileSystemWatcher。

 System;
 System.Collections.Generic;
 System.IO;
 System.Threading;
 Utility
{
      DelayFileSystemWatcher
    {
          Timer m_Timer;
          Int32 m_TimerInterval;
          FileSystemWatcher m_FileSystemWatcher;
          FileSystemEventHandler m_FileSystemEventHandler;
          Dictionary<String, FileSystemEventArgs> m_ChangedFiles =  Dictionary<, FileSystemEventArgs>();
         DelayFileSystemWatcher( path,  filter, FileSystemEventHandler watchHandler,  timerInterval)
        {
            m_Timer =  Timer(OnTimer, , Timeout.Infinite, Timeout.Infinite);
            m_FileSystemWatcher =  FileSystemWatcher(path, filter);
            m_FileSystemWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.CreationTime;
            m_FileSystemWatcher.Created += fileSystemWatcher_Changed;
            m_FileSystemWatcher.Changed += fileSystemWatcher_Changed;
            m_FileSystemWatcher.Deleted += fileSystemWatcher_Changed;
            m_FileSystemWatcher.Renamed += fileSystemWatcher_Changed;
            m_FileSystemWatcher.EnableRaisingEvents = ;
            m_FileSystemEventHandler = watchHandler;
            m_TimerInterval = timerInterval;
        }
          fileSystemWatcher_Changed( sender, FileSystemEventArgs e)
        {
             (m_ChangedFiles)
            {
                 (!m_ChangedFiles.ContainsKey(e.Name))
                {
                    m_ChangedFiles.Add(e.Name, e);
                }
            }
            m_Timer.Change(m_TimerInterval, Timeout.Infinite);
        }
          OnTimer( state)
        {
            Dictionary<String, FileSystemEventArgs> tempChangedFiles =  Dictionary<String, FileSystemEventArgs>();
             (m_ChangedFiles)
            {
                 (KeyValuePair<, FileSystemEventArgs> changedFile  m_ChangedFiles)
                {
                    tempChangedFiles.Add(changedFile.Key, changedFile.Value);
                }
                m_ChangedFiles.Clear();
            }
             (KeyValuePair<, FileSystemEventArgs> changedFile  tempChangedFiles)
            {
                m_FileSystemEventHandler(, changedFile.Value);
            }
        }
    }

使用方式如下:

        s_DelayFileSystemWatcher = new DelayFileSystemWatcher(@"C:\Temp", "*.xml", fileSystemWatcher_Changed, 1500);

        
private static void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            
switch (e.ChangeType)
            {
                
case WatcherChangeTypes.Created:
                    
//TODO
                    
break;
                
case WatcherChangeTypes.Deleted:
                    
//TODO                        
                    
break;
                
case WatcherChangeTypes.Changed:
                    
//TODO
                    
break;
                
default:
                    
break;
            }
        }

该文章在 2023/12/26 22:58:24 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved