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