簡體   English   中英

FileSystemwatcher以獲取文件列表

[英]FileSystemwatcher for a list of files

我一直按照這里的指導進行兩次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

        }
        }

這里的重點是“在一起”對您意味着什么。 畢竟,系統對每個對象都執行了獨立的刪除操作,從技術上講,這意味着它們並不是在同一時間被全部刪除,但是如果您想關閉它們,那么假設它們是否在彼此之間的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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM