W3docs

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).

Базовый пример

php— editable, runs on the server

Если 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.

Практика

Практика
Какова функция 'file_exists()' в PHP?
Какова функция 'file_exists()' в PHP?
Was this page helpful?