file_exists()
Функция file_exists() в PHP проверяет, существует ли файл или директория, и возвращает TRUE или FALSE.
Что такое функция file_exists()?
Функция file_exists() — встроенная функция PHP, которая проверяет, указывает ли заданный путь на файл или директорию в файловой системе. Это один из наиболее распространённых способов защиты файловых операций — её вызывают перед чтением, записью или удалением, чтобы скрипт не завершался с ошибкой при обращении к несуществующему пути.
Функция возвращает:
true, если путь существует (будь то обычный файл, директория, символическая ссылка или любой другой специальный файл), илиfalse, если по данному пути ничего нет, либо если у вас нет прав на получение информации о нём.
Синтаксис
file_exists(string $filename): bool$filename — путь для проверки. Это может быть:
- относительный путь (
'data/users.csv'), разрешаемый относительно текущего рабочего каталога, или - абсолютный путь (
'/var/www/uploads/logo.png'или'C:\\temp\\file.txt'в Windows).
Базовый пример
Если myfile.txt присутствует в рабочем каталоге скрипта, выполняется первая ветка; иначе — ветка else. Поскольку file_exists() возвращает обычное boolean-значение, его можно использовать напрямую в любом выражении if, && или тернарном операторе.
Кэш статистики файловой системы
PHP кэширует результаты проверок файловой системы (включая file_exists()), чтобы избежать многократного обращения к диску. В рамках одного запуска скрипта, если вы проверили путь, затем создали или удалили файл и проверили снова, вы можете получить устаревший ответ.
Вызовите clearstatcache(), чтобы принудительно выполнить повторный запрос:
<?php
$path = 'temp.txt';
file_put_contents($path, 'hello'); // create the file
clearstatcache(); // forget the cached result
var_dump(file_exists($path)); // bool(true)
unlink($path); // delete the file
clearstatcache();
var_dump(file_exists($path)); // bool(false)Этот кэш важен в долго выполняющихся скриптах и циклах, которые создают или удаляют файлы на лету.
file_exists() vs. is_file() vs. is_dir()
file_exists() не может сообщить что именно существует — только факт существования. Когда нужна точность, используйте более специализированную функцию:
| Функция | Возвращает true, если путь указывает на… |
|---|---|
file_exists() | файл или директорию (что угодно) |
is_file() | обычный файл |
is_dir() | директорию |
is_readable() | существующий и доступный для чтения текущим процессом объект |
is_writable() | существующий и доступный для записи текущим процессом объект |
Распространённая ошибка — использовать file_exists() для подтверждения того, что путь является файлом перед его открытием. Если директория окажется тёзкой файла, file_exists() вернёт true, но fopen() завершится неудачей. Для такого случая предпочтительнее использовать is_file().
Типичные случаи использования
Защита операции чтения от предупреждений:
<?php
$config = 'config.php';
if (is_file($config)) {
require $config;
} else {
die('Configuration file is missing.');
}Предотвращение перезаписи существующего загруженного файла путём добавления числового суффикса:
<?php
$target = 'upload.png';
$i = 1;
while (file_exists($target)) {
$target = "upload-$i.png";
$i++;
}
echo "Saving to: $target";Удаление файла только при его наличии, чтобы unlink() не предупреждал об отсутствующем пути:
<?php
$tmp = 'cache.tmp';
if (file_exists($tmp)) {
unlink($tmp);
}Важные моменты
- Состояние гонки. Файл может быть создан или удалён другим процессом между проверкой
file_exists()и следующей операцией. Для критичных операций записи зачастую безопаснее попытаться выполнить операцию и обработать возникшую ошибку, чем проверять заранее. - Права доступа. Если директория, ведущая к файлу, недоступна для PHP-процесса,
file_exists()вернётfalse, даже если файл физически существует. - Удалённые URL. При соответствующей конфигурации
file_exists()может работать с некоторыми обёртками потоков, однако надёжно проверитьhttp://URL она не может — вместо этого используйте функцию наподобиеfile_get_contents()с обработкой ошибок.
Подробнее о чтении и записи файлов читайте в главе Работа с файлами в PHP.