filetype()
Функция filetype() — встроенная функция PHP, которая возвращает тип файла в виде строки или false при ошибке.
Что такое функция filetype()?
filetype() — встроенная функция PHP, которая определяет тип записи файловой системы, на которую указывает путь: обычный файл, каталог, символическая ссылка и т.д. Она принимает один путь и возвращает тип в виде строки в нижнем регистре или false при ошибке.
Функция полезна при обходе каталога, когда нужно по-разному обрабатывать файлы и подкаталоги, при проверке того, что загруженный файл оказался там, где ожидалось, или когда нужно пропустить специальные записи (каналы, файлы устройств), которые не следует читать как обычные файлы.
Синтаксис:
Синтаксис PHP для filetype()
filetype(string $filename): string|falseГде $filename — относительный или абсолютный путь к записи, которую нужно проверить.
Возвращаемые значения
filetype() возвращает одну из следующих строк:
| Возвращаемая строка | Значение |
|---|---|
file | Обычный файл |
dir | Каталог |
link | Символическая ссылка |
fifo | Именованный канал (FIFO) |
socket | Unix domain socket |
block | Блочное специальное устройство (например, диск) |
char | Символьное специальное устройство (например, терминал) |
unknown | Тип не удалось определить |
Если путь не существует или недоступен для чтения, filetype() возвращает false и выдаёт предупреждение E_WARNING. Поскольку false при нестрогом сравнении равно пустой строке, всегда проверяйте результат с помощью === перед использованием.
Как использовать функцию filetype()?
Передайте путь и проверьте возвращённую строку:
Базовое использование
<?php
$path = __FILE__; // the path of the currently running script
$type = filetype($path);
echo "The entry '$path' is of type: $type";
// e.g. The entry '/var/www/index.php' is of type: fileИспользование __FILE__ гарантирует существование пути, поэтому пример работает в любом окружении без дополнительной настройки.
Обработка возврата false
Поскольку filetype() возвращает false при отсутствующем или нечитаемом пути, необходимо защитить вызов перед использованием результата. Предварительная проверка с помощью file_exists() полностью устраняет предупреждение:
Безопасное получение типа
<?php
$path = '/path/that/does/not/exist';
if (!file_exists($path)) {
echo "Path not found.";
} else {
$type = filetype($path);
echo $type === false
? "Could not determine the type."
: "Type: $type";
}
// Path not found.Различение файлов и каталогов при переборе
Распространённая задача — перебор каталога и работа только с файлами или только с подкаталогами. filetype() делает ветвление явным:
Классификация записей каталога
<?php
$dir = sys_get_temp_dir(); // a directory that always exists
foreach (scandir($dir) as $entry) {
if ($entry === '.' || $entry === '..') {
continue; // skip the self/parent references
}
$full = $dir . DIRECTORY_SEPARATOR . $entry;
echo $entry . ' => ' . filetype($full) . PHP_EOL;
}Здесь scandir() выводит содержимое каталога, а filetype() помечает каждую запись. Для низкоуровневого обхода можно использовать readdir() с opendir().
filetype() vs. is_file() и is_dir()
Если нужен ответ «да/нет» для одного конкретного типа, специализированные функции-предикаты выглядят понятнее и не требуют сравнения строк:
Используйте filetype(), когда нужно различить несколько возможных типов в одном месте (например, чтобы пропустить FIFO и сокеты), и применяйте is_file() / is_dir(), когда одна булева проверка читается лучше.
Следите за кэшем stat
PHP кэширует результаты функций файловой системы на время запроса, поэтому если путь создаётся, удаляется или заменяется после первой проверки, filetype() может вернуть устаревшее значение. Вызовите clearstatcache(), чтобы принудительно выполнить новый запрос. Также учтите, что filetype() разыменовывает символические ссылки так же, как stat() — чтобы обнаружить саму ссылку, используйте lstat().
Заключение
filetype() возвращает тип записи файловой системы в виде строки (file, dir, link и т.д.) и false при ошибке. Проверяйте результат с помощью ===, используйте file_exists() перед вызовом, чтобы избежать предупреждений, и не забывайте про clearstatcache() при повторной проверке пути, изменившегося в ходе запроса. Для простых проверок одного типа предпочтительнее is_file() и is_dir(); для получения полной статистики файла за один вызов смотрите stat().