"35.172.217.40 - 35.172.217.40"

Проверьте, открыт ли файл

Есть ли способ найти, открыт ли файл или нет?

+16
источник поделиться
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
источник

Как @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
источник

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

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

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

+1
источник

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос