Крис, На самом деле меня не интересует, что является исключением, я просто хочу убедиться, что объект FileSystemWatcher перезапущен.

у программу на c #, чтобы сообщить мне, когда файл был добавлен или удален. Я запускаю его на своем компьютере с Windows 7 и наблюдаю за FTP-сервером в нашей сети.

Это работает хорошо, но внезапно перестанет ловить любые события. Я предполагаю, что это может быть потеря соединения с сервером или сбой в сети.

Как я могу справиться с этой ситуацией в коде. Есть ли какое-то исключение, за которым я могу наблюдать и пытаться перезапустить объект FileSystemWatcher.

Любые предложения и примеры кода будут оценены.

 Oskar Kjellin31 мая 2011 г., 11:26
Проверьте этот вопрос об исключениях при чтении созданных файлов с помощью FileSystemWatcherstackoverflow.com/questions/699538/...
 Paul01 июн. 2011 г., 07:39
Я думаю, что знаю, что мне нужно делать сейчас. Перехватите исключение, которое выдает fileSystemWatcher, и затем попытайтесь снова включить вызов событий на нем, когда сервер снова станет доступен. Я не понимаю, куда бы я положил попробовать / поймать.
 leppie31 мая 2011 г., 11:19
Итак, если 1 КБ файла был загружен, как вы узнаете, что передача завершена? Я думаю, вам нужно переосмыслить свой подход здесь.
 Paul01 июн. 2011 г., 01:51
Он отлично работает для захвата, когда файлы создаются или удаляются. Мне просто нужно знать, как восстановить потерянное соединение или сбой сети. Существует ли какой-либо тип исключения, выдаваемый объекту FileSystemWatcher?

Ответы на вопрос(2)

Мне нужно было добавить обработчик ошибок для FileSystemWatcher

fileSystemWatcher.Error += new ErrorEventHandler(OnError);

И затем добавьте этот код:

private void OnError(object source, ErrorEventArgs e)
{
    if (e.GetException().GetType() == typeof(InternalBufferOverflowException))
    {
        txtResults.Text += "Error: File System Watcher internal buffer overflow at " + DateTime.Now + "\r\n";
    }
    else
    {
        txtResults.Text += "Error: Watched directory not accessible at " + DateTime.Now + "\r\n";
    }
    NotAccessibleError(fileSystemWatcher ,e);
}

Вот как я могу сбросить объект SystemFileWatcher:

   static void NotAccessibleError(FileSystemWatcher source, ErrorEventArgs e)
    {
        source.EnableRaisingEvents = false;
        int iMaxAttempts = 120;
        int iTimeOut = 30000;
        int i = 0;
        while (source.EnableRaisingEvents == false && i < iMaxAttempts)
        {
            i += 1;
            try
            {
                source.EnableRaisingEvents = true;
            }
            catch
            {
                source.EnableRaisingEvents = false;
                System.Threading.Thread.Sleep(iTimeOut);
            }
        }

    }

Я думаю, что этот код должен делать то, что я хочу.

 Paul02 июн. 2011 г., 13:45
Крис, На самом деле меня не интересует, что является исключением, я просто хочу убедиться, что объект FileSystemWatcher перезапущен.
 Chris Shain02 июн. 2011 г., 03:33
Если это действительно решает проблему, отметьте ее как ответ. Для чего это стоит, какое исключение было брошено?
Решение Вопроса

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

void NotAccessibleError(FileSystemWatcher source, ErrorEventArgs e)
{
    int iMaxAttempts = 120;
    int iTimeOut = 30000;
    int i = 0;
    while ((!Directory.Exists(source.Path) || source.EnableRaisingEvents == false) && i < iMaxAttempts)
    {
        i += 1;
        try
        {
            source.EnableRaisingEvents = false;
            if (!Directory.Exists(source.Path))
            {
                MyEventLog.WriteEntry("Directory Inaccessible " + source.Path + " at " + DateTime.Now.ToString("HH:mm:ss"));
                System.Threading.Thread.Sleep(iTimeOut);
            }
            else
            { 
                // ReInitialize the Component
                source.Dispose();
                source = null;
                source = new System.IO.FileSystemWatcher();
                ((System.ComponentModel.ISupportInitialize)(source)).BeginInit();
                source.EnableRaisingEvents = true;
                source.Filter = "*.tif";
                source.Path = @"\\server\dir";
                source.NotifyFilter = System.IO.NotifyFilters.FileName;
                source.Created += new System.IO.FileSystemEventHandler(fswCatchImages_Changed);
                source.Renamed += new System.IO.RenamedEventHandler(fswCatchImages_Renamed);
                source.Error += new ErrorEventHandler(OnError);
                ((System.ComponentModel.ISupportInitialize)(source)).EndInit();
                MyEventLog.WriteEntry("Try to Restart RaisingEvents Watcher at " + DateTime.Now.ToString("HH:mm:ss"));
            }
        }
        catch (Exception error)
        {
            MyEventLog.WriteEntry("Error trying Restart Service " + error.StackTrace + " at " + DateTime.Now.ToString("HH:mm:ss"));
            source.EnableRaisingEvents = false;
            System.Threading.Thread.Sleep(iTimeOut);
        }
    }
}
 Matt20 апр. 2016 г., 22:37
кажется, что он продолжает циклически повторять создание файловой системы, даже если в какой-то момент она была успешной. Не должен ли быть разрыв в петле «успеха»?
 Andreas Reiff13 окт. 2017 г., 10:56
@Matt Должен сломаться на 1) путь существует (доступен) и б) EnableRaisingEvents == true.

Ваш ответ на вопрос