【问题标题】:FileSystemwatcher for a list of filesFileSystemwatcher 用于文件列表
【发布时间】:2014-03-06 21:27:17
【问题描述】:

我一直遵循这里的指导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

        }
        }

【问题讨论】:

    标签: c# filesystemwatcher


    【解决方案1】:

    这里的重点是“在一起”对您意味着什么。毕竟系统对每个都进行了独立的删除操作,这在技术上意味着它们不会同时被删除,但是如果你只是想关闭,假设它们在彼此的 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);
            }
        }
    

    【讨论】:

    • 看起来文件系统观察程序在此代码之前 - 到可以更新 lastfired 值时,当我删除 40 个文件时,该事件已经被调用了 4 次。我想这是PC速度的函数。因此我会说上面的代码是有缺陷的。还有其他想法吗?
    • 公平地说,我认为您的回答非常好,是我能用的最好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多