Наблюдатель за файловой системой - папка удалена

Я пишу о сервисе, чтобы следить за существованием разных файлов в разных папках ... Я использую наблюдатели файловой системы для получения событий.

В ходе развертывания одна из наблюдаемых папок удаляется и время от времени создается новая.

В результате служба выдает ошибку и останавливается ...

Можно ли отловить такую ​​ошибку и воссоздать диспетчер файлов в новой папке службой?


person Doc Snuggles    schedule 06.05.2010    source источник


Ответы (2)


Поймать удаленное событие, а затем перепланировать его с опросом по времени, чтобы посмотреть новое?

У меня сейчас нет компилятора под рукой, но я выдумал этот псевдокод:

using System;
using System.IO;


    public class Watcher : IDisposable{

    void Dispose(){ watcher.OnDeleted -= onDelete; }


    string file;
    FileSystemWatcher watcher; 
    FileSystemEventHandler onDelete;

        public class Watch(string file, FileSystemEventHandler onDelete) {
        this.file = file;   
        watcher = new FileSystemWatcher{ Path = file }
        this.OnDelete = onDelete;
        watcher.Deleted += onDelete;
        watcher.NotifyFilter = ...; // looking for delete event;
            // Begin watching.
            watcher.EnableRaisingEvents = true;
    }
    }


    public static class watch {

    Watcher watcher;

       public static void Main() {



        watcher = new Watcher("somedir", ondeleted);
        SetUpChangeWatchers();
        while(true){
            // stuff!

        }

        CleanUpChangeWatchers();    
       }    


    private static void ondeleted(object source, RenamedEventArgs e){ 
        CleanUpChangeWatchers();
        watcher.Dispose();

        while(!directoryRecreated(file)){
            Thread.Sleep(...some delay..);
        }
        SetUpChangeWatchers();  
        watcher = new Watcher("somedir", ondeleted);

    }
}
person Preet Sangha    schedule 06.05.2010
comment
Простите форматирование, делал на своем медиацентре в блокноте lol - person Preet Sangha; 06.05.2010

Вы можете справиться с этим с помощью события .deleted. Однако, если вы удалите каталог, назначенный для filesystemwatcher.Path, это может вызвать ошибку. Один из способов обойти это - назначить родителю наблюдаемого каталога filesystemwatcher.Path. Затем он должен поймать удаление в событии .deleted.

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

person xpda    schedule 06.05.2010