我一直在遵循这里的指导FileSystemWatcher Changed event is raised twice。
但是我有一个我正在观看的文件列表,所以如果我一起删除20个文件,那么这个事件会被调用20次。这是预期的,并且工作正常。
如何为20个“同时”文件更改仅触发一次事件(即,如果下面Onchanged
的第一个实例中的代码完成,我怎么能忽略所有其他文件更改。现在{{ 1}}被称为20次。)?
Onchanged
答案 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);
}
}