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;
}
Согласен. Я бы создал специальный класс, который обертывает логику открытого файла или, по крайней мере, тест (IsFileAvailable). Это позволит вам передать управление исключениями конкретному ответственному классу и сделать его многоразовым. Вы даже можете применить дополнительную логику, например, проверить размер файла, чтобы увидеть, записывается ли файл и т. Д., Чтобы дать более подробный ответ. Это также сделает ваш потребляющий код намного чище.
Если вы имеете в виду, что хотите проверить, открыт ли файл, прежде чем пытаться его открыть, то нет. (По крайней мере, без перехода на низкий уровень и изучения каждого дескриптора файла, открытого в системе.)
Кроме того, информация будет устаревшей, когда вы ее получите. Даже если тест вернет, что файл не открыт, он мог быть открыт до того, как у вас будет возможность использовать возвращаемое значение.
Итак, правильный способ справиться с ситуацией - попытаться открыть файл и обработать любую ошибку, которая может произойти.
Как @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;
}