У меня была такая же проблема в DFS. Мое разрешение было достигнуто путем добавления двух пустых строк в каждый файл. Тогда мой код ждет две пустые строки в файле. Тогда у меня есть уверенность, чтобы прочитать все данные из файла.

лкиваюсь с проблемой с 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, потому что я хочу, чтобы только один сервер анализировал файл - сервер, который получает файл, сначала анализирует его.

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

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