W3docs

filetype()

Функция filetype() — встроенная функция PHP, которая возвращает тип файла в виде строки или false при ошибке.

Что такое функция filetype()?

filetype() — встроенная функция PHP, которая определяет тип записи файловой системы, на которую указывает путь: обычный файл, каталог, символическая ссылка и т.д. Она принимает один путь и возвращает тип в виде строки в нижнем регистре или false при ошибке.

Функция полезна при обходе каталога, когда нужно по-разному обрабатывать файлы и подкаталоги, при проверке того, что загруженный файл оказался там, где ожидалось, или когда нужно пропустить специальные записи (каналы, файлы устройств), которые не следует читать как обычные файлы.

Синтаксис:

Синтаксис PHP для filetype()

filetype(string $filename): string|false

Где $filename — относительный или абсолютный путь к записи, которую нужно проверить.

Возвращаемые значения

filetype() возвращает одну из следующих строк:

Возвращаемая строкаЗначение
fileОбычный файл
dirКаталог
linkСимволическая ссылка
fifoИменованный канал (FIFO)
socketUnix 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()

Если нужен ответ «да/нет» для одного конкретного типа, специализированные функции-предикаты выглядят понятнее и не требуют сравнения строк:

  • is_file()true, если путь является обычным файлом.
  • is_dir()true, если путь является каталогом.

Используйте 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().

Практика

Практика
Что делает функция is_file() в PHP?
Что делает функция is_file() в PHP?
Was this page helpful?