Вопрос по filesystemwatcher, c# – FileSystemwatcher для списка файлов

2

Я следовал указаниям здесьFileSystemWatcher Измененное событие возникает дважды.

Однако у меня есть список файлов, которые я смотрю, поэтому, если я удаляю 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   ответ
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, событие уже вызывалось 4 раза, когда я удаляю 40 файлов. Я думаю, это зависит от того, насколько быстро работает ПК. Поэтому я бы сказал, что приведенный выше код ошибочен. Есть другие идеи? user1438082
Чтобы быть справедливым, я думаю, что ваш ответ очень хороший и лучшее, что я могу использовать. user1438082

Похожие вопросы