gpt4 book ai didi

c# - FileSystemWatcher 的多个事件一次加薪

转载 作者:行者123 更新时间:2023-12-04 14:39:03 25 4
gpt4 key购买 nike

我需要在我将使用 FileSystemWatcher 的文件夹中记录文件的创建或复制/移动事件。问题是,当我将一个文件粘贴到文件夹中时,FileSystemWatcher 将引发一个 Created 事件。因此,如果我将 10 文件一起粘贴到该文件夹​​中,FileSystemWatcher 将引发 10 个事件。我的要求是,如果同时复制文件夹中的所有 10 个文件,则只引发一个事件。

请推荐。下面是我在 MSDN 教程的帮助下编写的代码。

public class FileSystemWatcherUtil2
{

public static void Main()
{
Run();
}

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public static void Run()
{
/* creation of a new FileSystemWatcher and set its properties */
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"C:\Users\TestFolder";

/*watch for internal folder changes also*/
watcher.IncludeSubdirectories = true;

/* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;

/* event handlers */
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);

/* watching started */
watcher.EnableRaisingEvents = true;

/* user should quit the program to stop watching*/
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}

/* event handlers definition for changed and renamed */
private static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}

private static void OnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}

}

最佳答案

想法是为 FileSystemWatcher 实现一个包装器,它公开自己的 CreatedEx 事件,该事件将模拟 FileSystemWatcher.Created 事件,但会引发一个每 10 次 Created 事件发生的时间。但请记住,我们不能确定所有处理程序 Created 事件都是在单个复制/移动操作的范围内引发的。为了提高这种方法的可靠性,我建议设置一个 DirectoryName NotifyFilters 值,这样您就可以观察到一个目录,但如果这符合您的要求,那当然可以。也许通过提供有关您的要求的更多详细信息,我们可以提供更多详细信息,这样方法会更可靠,基本上最重要的是确定批量复制/移动操作的常见范围,因此当您复制 100 个文件并 int 他同时操作系统启动的另一个复制操作正在进行中,您需要从您感兴趣的前一个操作中过滤掉它。所以也许文件的一些通用标准等。

  1. FileSystemWatcher 实现包装器
  2. 公开自己的 CreatedEx 事件
  3. 订阅 FileSystemWatcher.Created 事件并在处理程序中启动一个计时器,例如 200 毫秒。如果未引发 FileSystemWatcher.Created 事件 - 引发自己的 CreatedEx 事件,否则重置计时器并等待 200 毫秒。

定时器的时间可以通过实验确定,复制多个不同大小的文件,看哪个超时时间够。

如果您需要为恰好 10 个同时发生的事件引发一次 CreatedEx 事件 - 您可以在 FileSystemWatcher.Created 事件处理程序中引入简单的计数器和递减,并且当 counter==0 - 引发自己的 CreatedEx 事件。

关于c# - FileSystemWatcher 的多个事件一次加薪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9375879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com