c# - 用于文件列表的 FileSystemwatcher

标签 c# filesystemwatcher

我一直在关注这里的指导 FileSystemWatcher Changed event is raised twice .

但是我有一个我正在观看的文件列表,所以如果我一起删除 20 个文件,事件将被调用 20 次。这是预期的并且工作正常。

我怎样才能为 20 个“同时”文件更改只触发一次事件(即我怎样才能忽略所有其他文件更改,直到下面 Onchanged 的第一个实例中的代码完成。正确的现在 Onchanged 被调用了 20 次。) ?

private void Main_Load(object sender, EventArgs e)
{
    public static List<FileSystemWatcher> watchers = new List<FileSystemWatcher>();
    UpdateWatcher();
}


public void OnChanged(object sender, FileSystemEventArgs e)
{
    try
    {
      Logging.Write_To_Log_File("Item change detected " + e.ChangeType + " " + e.FullPath + " " + e.Name, MethodBase.GetCurrentMethod().Name, "", "", "", "", "", "", 2);
      watchers.Clear();

      foreach (FileSystemWatcher element in MyGlobals.watchers)
      {
        element.EnableRaisingEvents = false;
      }

      //Do some processing on my list of files here....
      return;

    }    
    catch (Exception ex)
    {
       // If exception happens, it will be returned here
    }                
    finally
    {
         foreach (FileSystemWatcher element in MyGlobals.watchers)
         {
            element.EnableRaisingEvents = true;
         }
    }
}





public void UpdateWatcher() // Check Items
        {

        try
        {
        watchers.Clear();

        for (int i = 0; i < MyGlobals.ListOfItemsToControl.Count; i++) // Loop through List with for
        {
        FileSystemWatcher w = new FileSystemWatcher();
         w.Path = Path.GetDirectoryName(MyGlobals.ListOfItemsToControl[i].sItemName); // File path    
        w.Filter = Path.GetFileName(MyGlobals.ListOfItemsToControl[i].sItemName); // File name
        w.Changed += new FileSystemEventHandler(OnChanged);
        w.Deleted += new FileSystemEventHandler(OnChanged);
        w.Created += new FileSystemEventHandler(OnChanged);
        w.EnableRaisingEvents = true;
        watchers.Add(w);
        }
        }
        catch (Exception ex)
        {
        // If exception happens, it will be returned here

        }
        }

最佳答案

这里的关键点是“在一起”对您意味着什么。毕竟系统对每个都执行独立的删除操作,这在技术上意味着它们不会在同一时间全部删除,但如果你只是想接近,假设它们在彼此相隔 5 秒内全部删除,那么我们只希望 OnChange 触发一次,您可以执行以下操作。请注意,这不会处理重命名更改通知。你没有听它,所以我认为你不需要。

您可能想根据您的使用情况将 5 秒窗口更改为一个小窗口。

    class SlowFileSystemWatcher : FileSystemWatcher
    {
        public delegate void SlowFileSystemWatcherEventHandler(object sender, FileSystemEventArgs args);

        public event SlowFileSystemWatcherEventHandler SlowChanged;
        public DateTime LastFired { get; private set; }

        public SlowFileSystemWatcher(string path)
            : base(path)
        {
            Changed += HandleChange;
            Created += HandleChange;
            Deleted += HandleChange;
            LastFired = DateTime.MinValue;
        }

        private void SlowGeneralChange(object sender, FileSystemEventArgs args)
        {
            if (LastFired.Add(TimeSpan.FromSeconds(5)) < DateTime.UtcNow)
            {
                SlowChanged.Invoke(sender, args);
                LastFired = DateTime.UtcNow;
            }
        }

        private void HandleChange(object sender, FileSystemEventArgs args)
        {
            SlowGeneralChange(sender, args);
        }

        protected override void Dispose(bool disposing)
        {
            SlowChanged = null;
            base.Dispose(disposing);
        }
    }

关于c# - 用于文件列表的 FileSystemwatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22236363/

相关文章:

c# - 在 Xamarin Forms C# 中发送 HTTP Post 请求

c# - "polling"在监视文件更改的上下文中意味着什么?

c++ - 使用 ReadDirectoryChangesW 是否需要管理员权限?

asp.net-core - AspNetCore 2.1 BackgroundService\IHostedService 中的 FileSystemWatcher

c# - 尝试访问 NetworkLobby 中的 LobbyPlayer 实例时出现 Unity NullPointerException

c# - LightSwitch -- 无法确定目标数据库架构提供程序

c# - 从内容类型为 application/json 的请求中检索值

c# - 获取字符串的前 250 个单词?

C# - 预测文件夹删除时的文件系统事件

c# - 我需要保留对 FileSystemWatcher 的引用吗?