TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.78K subscribers
Post #1296 1.56K
День 1056. #ЗаметкиНаПолях
Удалите Эти Бесполезные Вызовы 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
  • 👍 2
More from @netdeveloperdiary
  1. Oct 17, 2026День 2817. #ЧтоНовенького #VS Прекращаем Сборку После Первой Ошибки Мэдс Кристенсен продол…
  2. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  3. Oct 15, 2026Post #3374
  4. Oct 14, 2026Post #3373
  5. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  6. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →