John Pietrar John Pietrar - 1 month ago 18
C# Question

Tell fileSystemWatcher to wait

I have some files that are written to a folder.First there are 2 files written and after 10-20 minutes the next 2 files.

My question is:

Is there any possible way to tell the file system watcher
to wait until all 4 files are in the folder before executing my code?

Answer

According to @BugFinder 's suggestion I created something similar but didn't test. Hope it is useful:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace CustomFileWatcher
{
    public class CustomFileWatcher : IDisposable
    {
        private FileSystemWatcher fileWatcher;
        private IList<string> fileList;
        private IList<string> createdFiles;

        public event EventHandler FilesCreated;
        protected void OnFilesCreated(EventArgs e)
        {
            var handler = FilesCreated;
            if (handler != null)
                handler(this, e);
        }

        public CustomFileWatcher(IList<string> waitForTheseFiles, string path)
        {
            fileList = waitForTheseFiles;
            createdFiles = new List<string>();
            fileWatcher = new FileSystemWatcher(path);
            fileWatcher.Created += fileWatcher_Created;
        }

        void fileWatcher_Created(object sender, FileSystemEventArgs e)
        {
            foreach (var item in fileList)
            {
                if (fileList.Contains(e.Name))
                {
                    if (!createdFiles.Contains(e.Name))
                    {
                        createdFiles.Add(e.Name);
                    }
                }
            }

            if (createdFiles.SequenceEqual(fileList))
                OnFilesCreated(new EventArgs());
        }

        public CustomFileWatcher(IList<string> waitForTheseFiles, string path, string filter)
        {
            fileList = waitForTheseFiles;
            fileWatcher = new FileSystemWatcher(path,filter);
        }

        public void Dispose()
        {
            if (fileWatcher != null)
                fileWatcher.Dispose();
        }
    }
}

Usage

class Program
    {
        static void Main(string[] args)
        {
            IList<string> waitForAllTheseFilesToBeCopied = new List<string>();
            waitForAllTheseFilesToBeCopied.Add("File1.txt");
            waitForAllTheseFilesToBeCopied.Add("File2.txt");
            waitForAllTheseFilesToBeCopied.Add("File3.txt");

            string watchPath = @"C:\OutputFolder\";

            CustomFileWatcher customWatcher = new CustomFileWatcher(waitForAllTheseFilesToBeCopied, watchPath);

            customWatcher.FilesCreated += customWatcher_FilesCreated;
        }

        static void customWatcher_FilesCreated(object sender, EventArgs e)
        {
            // All files created.
        }
    }