C# FileSystemWatcher не смотрит все события - PullRequest
0 голосов
/ 23 апреля 2020

Это мой код FileSystemWatcher.

Я смотрю несколько папок. Когда я копирую образец из 19 файлов в папку A, наблюдатель, похоже, правильно фиксирует события и отправляет их на мой сервер sftp.

Однако, если я загружаю Папку A и Папку B одновременно, она захватывает только события Папки A и иногда, даже не полный список событий.

Я видел этот ответ и был Интересно, как я могу преобразовать свой код, чтобы быть более похожим на их код? Кажется, я отправляю свои события в отдельный поток, но он все еще не захватывает все события.

{ ссылка }

public class Program
{
    static FileSystemWatcher watcher;

    public static void Main(string[] args)
    {
        StartWatchers();
        // Run an infinite loop.
        while (true)
        {
            string line = Console.ReadLine();
        }
    }


    public static void StartWatchers()
    {
        ConfigurationData configurationData = new ConfigurationData();
        var configurations = configurationData.GetAll();

        List<FileSystemWatcher> watchers = new List<FileSystemWatcher>();


        int i = 0;
        foreach(var item in configurations)
        {
            watchers.Add(WatcherFactory(item));
            i++;
        }
        foreach(FileSystemWatcher watcher in watchers)
        {
            watcher.EnableRaisingEvents = true;
            Console.WriteLine("Watching folder {0}", watcher.Path);
            i++;
        }
    }

    public static FileSystemWatcher WatcherFactory(Data.Models.Configuration Input)
    {
        try
        {
            var maxThreads = 4;
            // Times 2 as most machines have double the logic processers as cores
            ThreadPool.SetMaxThreads(maxThreads, maxThreads * 2);

            watcher = new FileSystemWatcher(Input.SourcePath);

            watcher.NotifyFilter = NotifyFilters.Attributes |
            NotifyFilters.CreationTime |
            NotifyFilters.DirectoryName |
            NotifyFilters.FileName |
            NotifyFilters.Security |
            NotifyFilters.Size;

            watcher.Changed += new FileSystemEventHandler((s, e) => FileWatcher_Changed(s, e, Input));
            watcher.IncludeSubdirectories = false;


            return watcher;
        }
        catch (IOException ioe)
        {
            Console.WriteLine("An Exception Occurred :" + ioe);
            return null;
        }
        catch (Exception e)
        {
            Console.WriteLine("An Exception Occurred :" + e);
            return null;
        }
    }

    //This event adds the work to the Thread queue
    private static void FileWatcher_Changed(object s, FileSystemEventArgs e, Data.Models.Configuration Input)
    {
        ThreadPool.QueueUserWorkItem((o) => ProcessFile(s, e, Input));
    }

    private static void ProcessFile(object s, FileSystemEventArgs e, Data.Models.Configuration Input)
    {
        // Based on the eventtype you do your operation
        switch (e.ChangeType)
        {
            case WatcherChangeTypes.Changed:
                ChangeEvent(s, e, Input);
                break;
            case WatcherChangeTypes.Created:
                Console.WriteLine($"File is created: {e.Name}");
                break;
            case WatcherChangeTypes.Deleted:
                Console.WriteLine($"File is deleted: {e.Name}");
                break;
            case WatcherChangeTypes.Renamed:
                Console.WriteLine($"File is renamed: {e.Name}");
                break;
        }
    }

    static void ChangeEvent(object sender, FileSystemEventArgs e, Data.Models.Configuration Input)
    {
        try
        {
            watcher.EnableRaisingEvents = false;
            Console.WriteLine("{0}, with path {1} has been {2}", e.Name, e.FullPath, e.ChangeType);
            SFTP.Send(@e.FullPath, @Input.DestinationPath, @Input.PrivateKeyPath, Input.PrivateKeyPassword, Input.HostName, Input.PortNumber, Input.UserName, Input.Password);
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
        finally
        {
            watcher.EnableRaisingEvents = true;
        }
    }

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...