C# 在C中与fileSystemWatcher一起使用计时器#
这个场景是,我有一个根文件夹来监视任何新文件夹(包含文件),并设置一个计时器来分别压缩每个文件夹。但是,我无法判断文件夹中的文件是否是调用zip函数之前的最后一个文件,因此,每当在压缩文件夹之前创建新文件时,我都希望将计时器重置到该文件夹 我使用C# 在C中与fileSystemWatcher一起使用计时器#,c#,.net,reset,filesystemwatcher,system.timers.timer,C#,.net,Reset,Filesystemwatcher,System.timers.timer,这个场景是,我有一个根文件夹来监视任何新文件夹(包含文件),并设置一个计时器来分别压缩每个文件夹。但是,我无法判断文件夹中的文件是否是调用zip函数之前的最后一个文件,因此,每当在压缩文件夹之前创建新文件时,我都希望将计时器重置到该文件夹 我使用FileSystemWatcher监视根文件夹及其子文件夹 我不知道如何创建另一个监视程序来监视文件创建,可能是在OnTimedEvent方法中 我不知道在检测到该文件夹的文件后如何重置计时器。我认为还需要在OnTimedEvent中编写代码来重置它 下
FileSystemWatcher
监视根文件夹及其子文件夹
public class FileWatcher
{
private FileSystemWatcher _watcherRoot;
private Timer _timer;
private readonly string _watchedPath;
public FileWatcher(string path)
{
// _watcher = new FileSystemWatcher();
_timer = new Timer();
_watchedPath = path;
InitWatcher();
}
public void InitWatcher()
{
_watcherRoot = new FileSystemWatcher();
_watcherRoot.Path = _watchedPath;
_watcherRoot.IncludeSubdirectories = true;
_watcherRoot.EnableRaisingEvents = true;
_watcherRoot.Created += new FileSystemEventHandler(OnCreated);
}
private void OnCreated(object sender, FileSystemEventArgs e)
{
if (e.ChangeType == WatcherChangeTypes.Created)
{
string fullPath = e.FullPath;
if (sender == _watcherRoot)
{
// If detect new folder, set the timer to 5 sec
_timer.Interval = 5000;
_timer.Elapsed += OnTimedEvent;
_timer.AutoReset = true;
_timer.Enabled = true;
// a directory
Console.WriteLine($"{fullPath.ToString()} created on {DateTime.Now}");
}
}
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
// Create a 2nd Watcher??
// Reset the timer in here??
}
这里有一个简单的扩展方法来重置给定的计时器
public static void Reset(this Timer timer)
{
timer.Stop();
timer.Start();
}
要从事件内部获取计时器对象,您需要将
sender
强制转换为System.Timers.timer()
或在静态上下文中使用计时器 有一个非常聪明的库,名为,最初由Microsoft编写为“Rx”,但现在放在“System.Reactive”命名空间中。它允许您非常简单地编写复杂的事件驱动代码
例如,在您描述的场景中,您可以对FileSystemWatcher
的事件“作出反应”,并使用反应性“节流”,这意味着您只能在一段时间后收到事件通知,而该事件并未发生。您还可以将多个不同的事件合并在一起。将这两个特性放在一起,并订阅您的方法
如果这听起来像是一个可能的解决方案,你可能想看看,这里有一个关于解决这个问题的方法的问题,包括各种答案中的4种方法:(这不是这个问题的重复,因为您正在询问计时器,我建议您可能希望使用反应式扩展)。我使用lambda表达式作为“绑定”来解决这个问题计时器和观察者在一起,这是我发现的与此类似的情况。为什么您在这里使用计时器?是否要尝试在给定时间创建zip。您在这里尝试做什么?在处理文件之前,等待文件创建/修改停止?避免仍在写入的文件出现
文件锁定
异常其他情况下,您需要跟踪创建和更改的事件。一个计时器可能不够。@Patty_Putty我重复一遍:为什么在这里使用timerst?您可以在任何时间、任何事情、任何地方压缩(只要有权限)…那么为什么要使用单个计时器呢?我尝试模拟一台机器来监视子文件夹中的每个新文件创建。问题是,我无法判断文件的数量和大小是否在压缩之前等待它们完成。这就是为什么我需要设置计时器来监视它。