Как проверить открыт ли сейчас файл?.NET

350
15 июля 2017, 05:55

Нужно првоерить открыт ли сейчас файл в других процессах.

Суть программы не позволяет открывать файлы, которые используются в других процессах. Еще нужно запретить открывать файлы, если он используется в моей программе.

Как можно это сделать?

Answer 1

Напрашивается решение, возвращающее true/false в зависимости от того, открыт файл в стороннем ПО или нет.

Хотелось бы сразу предостеречь от такого подхода: дело в том, что файл может быть и не открыт, но с ним (с файлом) могут быть намного более «интересные» проблемы (например, этого файла может банально не существовать).

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

Расширение для Exception (конечно, при необходимости легко преобразуется в функцию):

public static class ExceptionExtension
{
  private const int ERROR_SHARING_VIOLATION = 32;
  private const int ERROR_LOCK_VIOLATION = 33; 
  public static bool IsFileLocked(this Exception exception)
   {
        int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
        return errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
   } 
}

Использование:

     FileStream fs = null;
     try
      {
          fs = System.IO.File.Open(filePath, FileMode.Open); // Пробуем открыть файл на чтение
          // ...или сразу читаем содержимое (при необходимости предварительно проверяем файл на размер)
          //byte[] fileBytes = System.IO.File.ReadAllBytes(filePath); 
      }
      catch (Exception ex)
      {
        if (ex.IsFileLocked)
         {
            // Файл открыт в стороннем процессе
            throw;
         }
         else 
         {
           // Произошла иная ошибка доступа к файлу
           throw; 
          }
       }
       finally
       {
         fs?.close();
       }
       // Файл не открыт в стороннем процессе
READ ALSO
Вопрос по выводу

Вопрос по выводу

В этом задании необходимо написать программу, объявит две переменные: первая переменная - переменная целочисленного (int) типа со значением...

256
Emgu CV Xamarin Adnroid

Emgu CV Xamarin Adnroid

Начинаю с просто на Emgu Xamarin

252
Открытие браузера c#

Открытие браузера c#

Как открыть браузер при нажатии на кнопку с указанным URL в textBox?

172