'C# FileSystemWatcher not firing off events - why not?

here is my code... no FileSystemWatcher events are ever hit wen creating a new file into the Foo directory. What is wrong with my code?

I am testing this from an NUnit test by calling fileMonitorService.StartMonitoringForNewFiles(new RobotParameters()).

// 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();
        }


    }


Solution 1:[1]

I never could get this to work and based on my google research, many others have had the same problem. I also tried using System.Timers.Timer and it's Elapsed event would not raise either. Google research showed lots of others having this problem too. All my code was in a try/catch and no errors were ever raised by either. I unfortunately had to write my own file monitor code and while it is not pretty, it works. I'm posting it for any others who may have this problem and who may be looking for a custom solution.

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;

            }


    }

Solution 2:[2]

Never too late to get the answer. You only needed to make a small adjustment:

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

Just remove the new FileSystemEventHandler:

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

This is what worked for me.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Frekster
Solution 2 Rick Walrond