Удалите Эти Бесполезные Вызовы File.Exists
Часть можно встретить код, который использует
File.Exists(path) перед открытием/записью файла. Этот шаблон очень подозрительный и может привести к неожиданным ошибкам. Рассмотрим следующий код:if (File.Exists(path))Есть несколько причин отказаться от этого подхода. На самом деле, другие приложения, работающие на машине, могут изменить файл между проверкой и вызовом
{
// Это безопасно?
using var stream =
File.Open(path, FileMode.Open);
// …
}
File.Open:- Файл может быть удалён другим приложением (в том числе антивирусом).
- Может отключиться диск или сеть
- и т.п.
Кроме того, даже если файл существует, возможно, вы не сможете его открыть:
- Что там с разрешениями?
- Может файл только для чтения/скрытый?
- Что делать, если файл заблокирован (в общем доступе)?
- Что, если на диске есть ошибка?
File.Exists указывает, существует ли указанный файл на момент его проверки. Возвращённое значение устаревает, как только метод возвращается. Если метод возвращает true, это не означает, что файл всё ещё будет существовать, когда вы попытаетесь его открыть.Вместо того, чтобы проверять, существует ли файл/каталог перед выполнением действия, просто добавьте обработку ошибок:
tryТо же касается проверки папок. Вместо:
{
using var stream = File.Open(path, FileMode.Open);
// …
}
catch (FileNotFoundException)
{
// …
}
catch (DirectoryNotFoundException)
{
// …
}
catch (UnauthorizedAccessException)
{
// …
}
catch (Exception)
{
// …
}
if (!Directory.Exists(path))Должно быть:
{
Directory.CreateDirectory(path);
}
Directory.CreateDirectory(path);Вместо:
if (Directory.Exists(path))Должно быть:
{
Directory.Delete(path);
}
tryЗаметьте, что это применимо к любому методу доступа к файловой системе: открытие/удаление файла или каталога, перечисление содержимого каталога и т.п.
{
Directory.Delete(path);
}
catch(DirectoryNotFoundException)
{
// ОК
}
catch(Exception ex)
{
// …
}
Итого
File.Exists/Directory.Exists следует использовать только в том случае, если вы хотите знать, существует ли файл/каталог на момент проверки. Например, чтобы избежать каких-либо действий, если файл уже существует. Когда метод возвращается, информация становится устаревшей. Действительно, файл мог быть создан/удалён сразу же другим приложением. Метод File.Exists бесполезен, если вы хотите читать/записывать в этот файл. В этом случае просто выполните необходимую операцию и обработайте исключения. Даже если файл существует, вы можете получить исключения по многим другим причинам.Источник: https://www.meziantou.net/is-file-exist-path-useless.htm