Файловые системы нестабильны. Это означает, что вы не можете доверять результату одной операции, чтобы он был действительным для следующей, даже если это следующая строка кода. Вы не можете просто сказать if (some file exists and I have permissions for it) open the file
, и вы не можете сказать if (some file does not exist) create the file
. Всегда существует вероятность того, что результат вашего условия if
изменит между между двумя частями вашего кода. Операции различны: не атомарные.
Что еще хуже, характер проблемы означает, что если у вас возникнет искушение сделать эту проверку, скорее всего, вы уже обеспокоены или знаете, что что-то, что вы не контролируете, может произойти с файлом. Природа сред разработки делает это событие менее вероятным во время тестирования и очень трудным для воспроизведения. Так что не только у вас есть ошибка, но ошибка не будет отображаться во время тестирования.
Поэтому при нормальных обстоятельствах лучший способ - даже не пытаться проверить, существует ли файл или каталог. Вместо этого потратьте время на разработку исключений из файловой системы. В любом случае вы должны обработать эти исключения, так что это намного лучше использует ваши ресурсы. Несмотря на то, что исключения являются медленными, проверка существования файла требует дополнительной поездки на диск, и доступ к диску становится на намного медленнее. У меня даже есть хорошо проголосовавший ответ на этот счет в другом вопросе.
Но у меня есть некоторые сомнения. Например, в .Net, если это действительно всегда true, методы .Exists()
не были бы в API в первую очередь. Также рассмотрите сценарии, в которых вы ожидаете, что вашей программе понадобится создать файл. Первый пример, который приходит на ум, касается настольного приложения. Это приложение устанавливает файл конфигурации пользователя по умолчанию в свой домашний каталог, и при первом запуске каждого пользователя приложение копирует этот файл в папку данных приложения этого пользователя. Ожидается, что файл не будет существовать при первом запуске.
Итак, когда допустимо заранее проверять наличие (или других атрибутов, таких как размер и разрешения) файла? Является ли ожидание неудачи, а не успеха с первой попытки достаточно хорошим эмпирическим правилом?