FileSystemwatcher用于文件列表

时间:2014-03-06 21:27:17

标签: c# filesystemwatcher

我一直在遵循这里的指导FileSystemWatcher Changed event is raised twice

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

如何为20个“同时”文件更改仅触发一次事件(即,如果下面Onchanged的第一个实例中的代码完成,我怎么能忽略所有其他文件更改。现在{{ 1}}被称为20次。)?

Onchanged

1 个答案:

答案 0 :(得分: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);
        }
    }