2012-02-13 4 views
2

У меня есть FileSystemWatcher для проверки новых файлов, сохранения содержимого в базе данных и удаления файлов. Около 10 дней назад он начал игнорировать некоторые файлы. Мы говорим о 1500 файлах из 50 000 файлов. Ручным перемещением файлов в другой каталог, а затем перемещением их обратно в наблюдаемый каталог, файлы будут замечены.FileSystemWatcher иногда не работает

ВнутреннийBufferSize имеет значение 32 kB для обработки больших партий. Он обрабатывает 300+ файлов одновременно без проблем, и реальность даже не близка к этому.

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

Что может вызвать такую ​​проблему, как этот? Есть ли вероятность, что FileSystemWatcher просто unreliable?

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

private void button1_Click(object sender, EventArgs e) 
    { 
     fsw = new FileSystemWatcher(); 
     fsw.Path = @"C:\temp\fsw-test"; 
     fsw.IncludeSubdirectories = false; 
     fsw.NotifyFilter = NotifyFilters.FileName; 
     fsw.Created += new FileSystemEventHandler(fsw_Created_handler); 
     fsw.EnableRaisingEvents = true; 
     fsw.InternalBufferSize = 32768; 
     fsw.Error += fsw_Error_handler; 
    } 

    private void fsw_Created_handler(object sender, FileSystemEventArgs e) 
    { 
     new Thread(new ParameterizedThreadStart(work)).Start(e); 
    } 

    private void fsw_Error_handler(object sender, ErrorEventArgs e) 
    { 
     EventLog.WriteEntry("few test", e.GetException().Message); 
    } 

    private void work(object e) 
    { 
     try 
     { 
      EventLog.WriteEntry("fsw test", "Queueing File Started"); 
      Thread.Sleep(10000); 
      EventLog.WriteEntry("fsw test", ((FileSystemEventArgs)e).Name); 
      EventLog.WriteEntry("fsw test", "Queueing File Done"); 
     } 
     catch (Exception ex) 
     { 
      EventLog.WriteEntry("fsw test", "Error = " + ex.StackTrace + " *** " + ex.ToString()); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     for (int i = 1; i <= 1000; i++) 
     { 
      System.IO.File.Create(@"C:\temp\fsw-test\" + i); 
     } 
    } 

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

+0

Единственный совет, который я могу дать, это то, что некоторые из параметров 'FileSystemWatcher' были довольно загадочными. Когда я использовал его, я настроил то, что, как я думал, поймал reads/write/edits, но он не поймал их всех. Возможно, появились новые «случаи» того, как файлы «создаются», и FSW не настроен, чтобы их поймать, но он по-прежнему настроен на «перемещение», поэтому перемещение их из одного каталога в другой работает. – Origin

+0

@Origin Каждый файл поступает в систему точно так же. – Stijn

+0

Вы отслеживаете событие «Ошибка» у наблюдателя? – adrianm

ответ

0

Проблема оказалась Queue повреждение вследствие многопоточности.

2

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

Один из способов обойти это, когда происходит новое файловое событие, работать с файлом и перед возвратом, проверить наличие новых файлов. Петля до тех пор, пока не останется файлов.

+0

Если это правда, тогда существует неотъемлемая раса (даже если она небольшая), что может быть невозможно обходным путем - после того, как обработчик события решит, что новых файлов не будет, всегда будет некоторый короткий период времени, когда могут произойти изменения файловой системы прежде чем управление вернется к тому, что инициирует события. –

+0

Обработчик события 'Created' запускает новый поток каждый раз, чтобы выполнить фактическую обработку. Как отмечалось в этом вопросе, я могу удалить более 300 файлов в каталог, и каждый из них будет обработан.Или я не понимаю, что вы имеете в виду? Обходной путь действительно возможен, но потом я мог бы полностью удалить FileSystemWatcher и периодически опробовать каталог для файлов. – Stijn

+0

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

Смежные вопросы