FileSystemwatcher для списка файлов
Я следовал указаниям здесь событие Filesystemwatcher Changed вызывается дважды.
Однако у меня есть список файлов, которые я смотрю, поэтому, если я удаляю 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
}
}
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); } }
Comments