Проверьте, открыт ли файл [дубликат]

17
задан Pranay Rana 9 February 2012 в 15:15
поделиться

4 ответа

protected virtual bool IsFileinUse(FileInfo file)
{
     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();
     }
     return false; 
}
26
ответ дан 30 November 2019 в 12:06
поделиться

Согласен. Я бы создал специальный класс, который обертывает логику открытого файла или, по крайней мере, тест (IsFileAvailable). Это позволит вам передать управление исключениями конкретному ответственному классу и сделать его многоразовым. Вы даже можете применить дополнительную логику, например, проверить размер файла, чтобы увидеть, записывается ли файл и т. Д., Чтобы дать более подробный ответ. Это также сделает ваш потребляющий код намного чище.

0
ответ дан 30 November 2019 в 12:06
поделиться

Если вы имеете в виду, что хотите проверить, открыт ли файл, прежде чем пытаться его открыть, то нет. (По крайней мере, без перехода на низкий уровень и изучения каждого дескриптора файла, открытого в системе.)

Кроме того, информация будет устаревшей, когда вы ее получите. Даже если тест вернет, что файл не открыт, он мог быть открыт до того, как у вас будет возможность использовать возвращаемое значение.

Итак, правильный способ справиться с ситуацией - попытаться открыть файл и обработать любую ошибку, которая может произойти.

1
ответ дан 30 November 2019 в 12:06
поделиться

Как @pranay rana, но нам нужно убедиться, что мы закрыли наш файловый хэндл:

public bool IsFileInUse(string path)
{
  if (string.IsNullOrEmpty(path))
    throw new ArgumentException("'path' cannot be null or empty.", "path");

  try {
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
  } catch (IOException) {
    return true;
  }

  return false;
}
7
ответ дан 30 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: