Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中与fileSystemWatcher一起使用计时器#_C#_.net_Reset_Filesystemwatcher_System.timers.timer - Fatal编程技术网

C# 在C中与fileSystemWatcher一起使用计时器#

C# 在C中与fileSystemWatcher一起使用计时器#,c#,.net,reset,filesystemwatcher,system.timers.timer,C#,.net,Reset,Filesystemwatcher,System.timers.timer,这个场景是,我有一个根文件夹来监视任何新文件夹(包含文件),并设置一个计时器来分别压缩每个文件夹。但是,我无法判断文件夹中的文件是否是调用zip函数之前的最后一个文件,因此,每当在压缩文件夹之前创建新文件时,我都希望将计时器重置到该文件夹 我使用FileSystemWatcher监视根文件夹及其子文件夹 我不知道如何创建另一个监视程序来监视文件创建,可能是在OnTimedEvent方法中 我不知道在检测到该文件夹的文件后如何重置计时器。我认为还需要在OnTimedEvent中编写代码来重置它 下

这个场景是,我有一个根文件夹来监视任何新文件夹(包含文件),并设置一个计时器来分别压缩每个文件夹。但是,我无法判断文件夹中的文件是否是调用zip函数之前的最后一个文件,因此,每当在压缩文件夹之前创建新文件时,我都希望将计时器重置到该文件夹

我使用
FileSystemWatcher
监视根文件夹及其子文件夹

  • 我不知道如何创建另一个监视程序来监视文件创建,可能是在OnTimedEvent方法中
  • 我不知道在检测到该文件夹的文件后如何重置计时器。我认为还需要在OnTimedEvent中编写代码来重置它
  • 下面是我尝试的代码的一部分,可以找到源代码。我们将非常感谢您的帮助

        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?您可以在任何时间、任何事情、任何地方压缩(只要有权限)…那么为什么要使用单个计时器呢?我尝试模拟一台机器来监视子文件夹中的每个新文件创建。问题是,我无法判断文件的数量和大小是否在压缩之前等待它们完成。这就是为什么我需要设置计时器来监视它。