【问题标题】:C# FileSystemWatcher not firing off events - why not?C# FileSystemWatcher 没有触发事件 - 为什么不呢?
【发布时间】:2022-04-25 12:48:58
【问题描述】:

这是我的代码...在 Foo 目录中创建新文件时,不会触发任何 FileSystemWatcher 事件。我的代码有什么问题?

我正在通过调用 fileMonitorService.StartMonitoringForNewFiles(new RobotParameters()) 从 NUnit 测试中对此进行测试。

// attribute for autofac IoC
    [AutoRegister]
    public class FileMonitorService
    {
        private FileSystemWatcher _fileWatcher = new FileSystemWatcher();

        public void StartMonitoringForNewFiles(RobotParameters parameters)
        {

        _fileWatcher.Path = @"c:\testfiles\foo";
            _fileWatcher.NotifyFilter = NotifyFilters.Attributes |
                NotifyFilters.CreationTime |
                NotifyFilters.FileName |
                NotifyFilters.LastAccess |
                NotifyFilters.LastWrite |
                NotifyFilters.Size |
                NotifyFilters.Security;

            _fileWatcher.Filter = "*.xlsx";
            _fileWatcher.Created += new FileSystemEventHandler((sender, e)  => OnFileCreated(sender, e, parameters));
            _fileWatcher.Renamed += new RenamedEventHandler((sender, e) => OnFileRenamed(sender, e, parameters));
            _fileWatcher.Error += new ErrorEventHandler(OnError);
            _fileWatcher.EnableRaisingEvents = true;
            }

        public void StopMonitoringForFiles()
        {
_fileWatcher.EnableRaisingEvents = false;
        }

        private void OnFileRenamed(object sender, RenamedEventArgs e, RobotParameters parameters)
        {
            parameters.FileToProcess = e.FullPath;
            parameters.FileCreated = true;
        }

        private void OnFileCreated(object sender, FileSystemEventArgs e, RobotParameters parameters)
        {
            parameters.FileToProcess = e.FullPath;
            parameters.FileCreated = true;
        }

        private void OnError(object sender, ErrorEventArgs e)
        {
            var foo = e.GetException();
        }


    }

【问题讨论】:

  • FSW没有bug,考虑重点测试代码。顺便说一句,它看不到 OnError 并不漂亮。
  • 也许是一个显而易见的问题,但您将过滤器设置为 .xlsx 文件。您创建的测试文件是否使用该扩展名?
  • 安迪是的,它是一个 .xlsx 文件...我将它复制到 Foo 目录中,并且没有引发任何事件。由于某种原因,每个事件中的断点都不会被命中。
  • 无法重现。事件如预期上升。按照此处发布的方式实施。错误在其他地方(类没有正确实例化?)。
  • 您意识到如果事件被引发,您将不​​断地覆盖parameters 的属性,因为单个共享实例被传递到每个事件中。如果在您处理它之前,两个不同文件的事件快速连续触发两次(我假设这里没有显示其他一些代码)您打算做什么?

标签: c# filesystemwatcher


【解决方案1】:

我永远无法让它工作,并且根据我的谷歌研究,许多其他人都遇到了同样的问题。我也尝试使用 System.Timers.Timer 并且它的 Elapsed 事件也不会引发。谷歌研究表明很多其他人也有这个问题。我所有的代码都在 try/catch 中,并且两者都没有引发任何错误。不幸的是,我不得不编写自己的文件监视器代码,虽然它不漂亮,但它可以工作。我将它发布给可能遇到此问题并且可能正在寻找自定义解决方案的任何其他人。

public  class FileMonitorService
    {
        private bool stopProcessing = false;

        public  void StartMonitoringForNewFiles(RobotParameters parameters)
        {
            try
            {
                while (stopProcessing == false)
                {

                        stopProcessing = IsFileReady(parameters);
                    Thread.Sleep(5000);      // sleeps for 5 seconds 

                    if (stopProcessing == true)
                    {
                        break;      // get out of loop since file is ready
                    }
                }
            }
            catch (Exception e)
            {
                throw;
            }
        }

        private bool IsFileReady(RobotParameters parameters)
        {
                try
                {
// code to try opening a file goes here
// or code to see if files exist goes here

// assuming file was opened with no errors and is ready for processing

                    return true;
                }
                catch (Exception e)
                {

// file is not ready for processing
// and could not be opened
                    return false;

                }
            }


            return false;

            }


    }

【讨论】:

    【解决方案2】:

    得到答案永远不会太晚。你只需要做一个小的调整:

    _fileWatcher.Created += new FileSystemEventHandler((sender, e) => OnFileCreated(sender, e, parameters));
    _fileWatcher.Renamed += new RenamedEventHandler((sender, e) => OnFileRenamed(sender, e, parameters));
    

    只需删除新的 FileSystemEventHandler:

    _fileWatcher.Created += (sender, e) => OnFileCreated(sender, e, parameters);
    _fileWatcher.Renamed += (sender, e) => OnFileRenamed(sender, e, parameters);
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多