У меня есть 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 нагрузочного тестирования программы несколькими способами и проверки кода снова и снова не было выявлено никаких проблем. Так что сейчас это неустранимая ошибка, я сделаю несколько изменений, чтобы сделать журнал более частым и следить за ситуацией.
Единственный совет, который я могу дать, это то, что некоторые из параметров 'FileSystemWatcher' были довольно загадочными. Когда я использовал его, я настроил то, что, как я думал, поймал reads/write/edits, но он не поймал их всех. Возможно, появились новые «случаи» того, как файлы «создаются», и FSW не настроен, чтобы их поймать, но он по-прежнему настроен на «перемещение», поэтому перемещение их из одного каталога в другой работает. – Origin
@Origin Каждый файл поступает в систему точно так же. – Stijn
Вы отслеживаете событие «Ошибка» у наблюдателя? – adrianm