Я столкнулся с проблемой с FileSystemWatcher, когда несколько файлов помещаются в наблюдаемый каталог. Я хочу разобрать файл, как только он будет помещен в каталог. Как правило, первый файл анализируется нормально, но добавление второго файла в каталог вызывает проблемы с доступом. Иногда первый файл даже не анализируется. Существует только одно приложение, работающее и просматривающее этот каталог. В конце концов, этот процесс будет запущен на нескольких машинах, и они будут наблюдать за общим каталогом, но только один сервер может анализировать каждый файл, поскольку данные импортируются в базу данных, а первичные ключи отсутствуют.
Вот код FileSystemWatcher:
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
Затем метод, который анализирует файл:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
При перемещении второго файла он ловит
System.IO.IOException: процесс не может получить доступ к файлу 'C: \ Temp \ TestFile.txt', поскольку он используется другим процессом.
Я бы ожидал увидеть эту ошибку, если бы она работала на нескольких машинах, но пока она работает только на одном сервере. Не должно быть другого процесса, использующего этот файл - я создал его и скопировал в каталог, когда приложение запущено.
Это правильный способ настройки FileSystemWatcher? Как я могу увидеть, что блокирует этот файл? Почему он не анализирует оба файла - я должен закрыть FileStream? Я хочу сохранить опцию FileShare.None, потому что я хочу, чтобы только один сервер анализировал файл - сервер, который получает файл, сначала анализирует его.