.NET: FileWatcher не работает для нескольких файлов

Я пытаюсь реализовать Filewatcher, который будет отслеживать каталог FilesDir на предмет создания или изменения (если данные изменены) файлы. Он отлично работает, если я копирую и вставляю только один файл в FileDir, но если я копирую и вставляю несколько файлов, то событие File_Created вызывается только для одного из них. файлы.

public void SetUpFileWatcher()
{

    var sourcePath = ConfigurationManager.AppSettings["DirectoryPath"];
    var fileSystemWatcher = new FileSystemWatcher();

    fileSystemWatcher.IncludeSubdirectories = false;
    fileSystemWatcher.Filter = ConfigurationManager.AppSettings["FileType"];
    fileSystemWatcher.Path = sourcePath;
    fileSystemWatcher.EnableRaisingEvents = true;
    fileSystemWatcher.Created += FileMonitorWatcher_FileCreated;
    fileSystemWatcher.Changed += FileMonitorWatcher_FileChanged;


    Logger.Info("SetUpFileWatcher", "End of Setting Up File Watcher");
}


/// <summary>
/// Event called when a new file is created.
/// </summary>
/// <param name="sender">sender</param>
/// <param name="e">FileSystemEventArgs</param>
private void FileMonitorWatcher_FileCreated(object sender, FileSystemEventArgs e)
{
    Logger.Info("FileMonitorWatcher_FileCreated", "File created method started....");

    ((FileSystemWatcher)(sender)).EnableRaisingEvents = false;
    FileMonitorManager fileMonitorMgr = new FileMonitorManager();
    fileMonitorMgr.FileCreated(e.FullPath);
    ((FileSystemWatcher)(sender)).EnableRaisingEvents = true;
    Logger.Info("FileMonitorSystemWatcher_Created:End", "Create Function for File Watcher End at: " + DateTime.Now.ToString());
}

        /// <summary>
/// Event called when a file is changed.
/// </summary>
/// <param name="sender">sender</param>
/// <param name="e">FileSystemEventArgs</param>
private void FileMonitorWatcher_FileChanged(object sender, FileSystemEventArgs e)
{
    Logger.Info("FileMonitorWatcher_FileChanged", "Updated method started....");

    ((FileSystemWatcher)(sender)).EnableRaisingEvents = false;
    FileMonitorManager fileMonitorMgr = new FileMonitorManager();
    fileMonitorMgr.FileCreated(e.FullPath);
    ((FileSystemWatcher)(sender)).EnableRaisingEvents = true;
    Logger.Info("FileMonitorSystemWatcher_Changed:End", "Update Function for File Watcher End at: " + DateTime.Now.ToString());
}

Справка:

Итак, мне нужно, чтобы мой FileWatcher наблюдал за каталогом и вызывал событие File_Created только при создании нового файла и событие File_Changed только при изменении некоторых данных внутри файла.

Примечание.

Всякий раз, когда файл изменяется или создается в отслеживаемом каталоге, для этого файла вызывается метод SomeTimeConsumingMethod() для заполнения данных в базе данных. Метод SomeTimeConsumingMethod() в моем случае занимает около 3-4 минут.


person Coding man    schedule 10.03.2015    source источник
comment
Дублирующий вопрос, да, ответил - нет. Лучшее решение — использовать ActionBlock или Task.Run для асинхронной обработки событий. Таким образом, буфер не переполнится, и вы не потеряете события. Это также упростит код и обеспечит потокобезопасность. Я предполагаю, что именно поэтому вы отключаете FSW всякий раз, когда получено событие.   -  person Panagiotis Kanavos    schedule 10.03.2015
comment
Вы также можете отслеживать событие Error.   -  person juharr    schedule 10.03.2015