FileSystemWatcher .NET аварийно завершает работу при возникновении исключения, файл throw используется для будущих файлов - PullRequest
5 голосов
/ 22 ноября 2011

У меня проблемы с работой над файловой системой, это сводит меня с ума.

Оказывается, я слежу за новыми текстовыми файлами в папке, когда создается событие Created, я в основном читаю его, используя следующий код:

string txtTemp = File.ReadAllText(MyFilePath);

После этого я обрабатываюданные в строке txtTemp, в основном я читаю их строки и сохраняю данные в БД, довольно просто, не правда ли?

Проблема в том, что в этом процессе возникает исключение (скажем, соединение с БД не удалось), не имеет значения, поймаю ли я его, потому что для следующих поступающих файлов приложение сгенерирует исключение, говорящее

"Процесс не может получить доступ к файлу 'theNewComingFile.txt', поскольку он используетсядругим процессом. "

Почему новый созданный файл может использоваться, если он даже не был открыт или прочитан?И приложение продолжает выдавать это исключение «процесс не может получить доступ к файлу» для всех новых файлов.

Единственное, что мы можем сделать, это закрыть и снова открыть приложение, это сбрасывает приложение и все снова работает нормально, пока снова не будет сгенерировано исключение любого типа> (черт возьми!)

Любойидеи?любой обходной путь?Какие-нибудь мысли?любые предложения какие-нибудь ... что-нибудь?хе-хе-хе =)

Спасибо, чуваки !!

Ответы [ 4 ]

5 голосов
/ 22 ноября 2011

Вы можете начать расследование с помощью Sysinternals Process Explorer .Это даст вам более подробную информацию, особенно о том, какой процесс содержит файл.

2 голосов
/ 22 ноября 2011

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

Возможно, вы захотите попробовать изменить свой дизайн так, чтобы события помещались в очередь, если (и только если) файл еще не поставлен в очередь на обработку.Затем вы можете перехватывать исключения и т. Д. Под надлежащим контролем в другом потоке, не мешая Наблюдателю.

[В прошлом я видел несколько очень интересных случаев с FileSystemWatcher -это может быть немного зверя, когда загнан в угол.Один (некоторое время назад) вызвал не совсем воспроизводимое зависание синего экрана в Windows Server 2003, когда внутренний буфер переполнился, потому что он был переполнен событиями.Лучше быть осторожным.]

2 голосов
/ 22 ноября 2011

Событие Created наступает до завершения полной записи файла.

С MSDN :

Событие OnCreated возникает, как толькофайл создан.Если файл копируется или передается в отслеживаемый каталог, событие OnCreated будет вызвано немедленно, за которым последует одно или несколько событий OnChanged.

Таким образом, получение описанного вами исключения будет вполне нормальным.Когда я столкнулся с такой ситуацией, я сначала тестирую файл, чтобы узнать, могу ли я получить к нему доступ или нет.Вот функция, которую я использую:

  private static bool GetExclusiveAccess(string filePath)
  {
     try
     {
        using (FileStream file = new FileStream(filePath, FileMode.Append, FileAccess.Write))
        {
           file.Close();
           return true;
        }
     }
     catch (IOException)
     {
        return false;
     }
  }

Если у вас нет доступа, вам придется подождать и проверить еще раз.

0 голосов
/ 22 ноября 2011

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

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