2015-03-31 7 views
0

Есть ли все еще, чтобы ждать, пока этот файл не откроется перед чтением? Файл, который читается, будет писать довольно много и не хочет, чтобы эта ошибка продолжалась. Должен ли я делать цикл while с задержкой, прежде чем пытаться его прочитать? Это страница статистики в реальном времени, поэтому перезагрузка этой страницы произойдет совсем немного.Чтение файла, который может быть обновлен

System.IO.IOException: The process cannot access the file because it is being used by another process. 

ответ

1

Чтобы проверить, если файл заблокирован, вы можете использовать эту функцию:

protected virtual bool IsFileLocked(string filePath) 
    { 
     FileInfo file = new FileInfo(filePath); 
     FileStream stream = null; 

     try 
     { 
      stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
     } 
     catch (IOException) 
     { 
      //the file is unavailable because it is: 
      //still being written to 
      //or being processed by another thread 
      //or does not exist (has already been processed) 
      return true; 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 

     //file is not locked 
     return false; 
    } 

Обычно это не хорошо использовать исключение в вашей обычной логике, но в этом случае вы не можете иметь выбор. Вы можете называть это каждые X секунд, возможно, для проверки блокировок. Альтернативой может быть использование объекта наблюдателя файловой системы для мониторинга файла. Трудно сказать, не зная больше о вашем конкретном случае использования.

+1

Обратите внимание, что вы все еще имеете условие гонки - файл может быть заблокирован между этой функцией, возвращающей true, и попыткой открыть файл. Вы могли бы просто попытаться открыть его для реального и обработать сбой, как если бы эта функция вернула false. – Blorgbeard

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