Filetype: примеры (PHP)

Определение типа файла через filetype
Раздел: Работа с файловой системой
filetype(string $filename): string|false
Основные сведения о функции filetype

Функция filetype в PHP определяет тип файла по указанному пути. Её применяют для получения информации о природе элемента файловой системы: является ли он обычным файлом, директорией, ссылкой или специальным типом вроде сокета.

Аргументы функции:

  • filename (string) – путь к проверяемому файлу или каталогу. Это единственный обязательный параметр.

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

  • Строка с типом: 'file' (обычный файл), 'dir' (директория), 'link' (символическая ссылка), 'fifo' (именованный канал), 'char' (символьное устройство), 'block' (блочное устройство), 'socket' (сокет), 'unknown' (неизвестный тип).
  • false – в случае неудачи (например, если файл не существует).
Простые примеры вызова filetype
Обычный файл
echo filetype('document.pdf');
file
Папка
echo filetype('/var/log');
dir
Символическая ссылка
echo filetype('/usr/local/bin/php8');
link
Ошибка при отсутствии файла
var_dump(filetype('missing.txt'));
bool(false)
Другие функции PHP для работы с файлами

Для проверки типа файла иногда удобнее использовать специализированные функции:

  • is_file() – проверяет, является ли путь обычным файлом.
  • is_dir() – определяет, является ли путь директорией.
  • is_link() – выясняет, является ли путь символьной ссылкой.
  • file_exists() – проверяет существование файла или папки.
  • stat() – возвращает массив с детальной информацией о файле, включая индекс типа в поле 'mode'.

Функция filetype полезна, когда требуется именно строковый идентификатор типа. Для конкретных проверок лучше подходят is_file или is_dir.

Распространённые ошибки при применении filetype
Попытка проверить несуществующий путь

Если файл отсутствует, функция возвращает false и генерирует предупреждение (E_WARNING).

$type = filetype('ghost.txt');
if ($type === false) {
    echo 'Не удалось определить тип';
}
Не удалось определить тип
Отсутствие прав доступа

При недостаточных разрешениях для чтения информации о файле также возвращается false.

var_dump(filetype('/etc/shadow'));
bool(false)
Символические ссылки

Функция возвращает 'link' для самой ссылки, а не для целевого объекта. Для получения типа цели нужны дополнительные проверки.

// link -> /etc
echo filetype('/tmp/mylink');
link
Нововведения в PHP 8

В PHP 8.0 значительных изменений в поведении filetype не было. Однако общее усиление строгости типов может влиять на передачу аргументов. В версии 8.1 и выше также не зафиксировано специфичных изменений для этой функции.

Сложные и специальные примеры
Рекурсивный вывод типов в каталоге

Функция помогает при обходе дерева каталогов.

Пример php
function scanTypes($path) {
    foreach (scandir($path) as $item) {
        if ($item === '.' || $item === '..') continue;
        $full = $path . '/' . $item;
        $type = filetype($full);
        echo $full . ' => ' . $type . PHP_EOL;
        if ($type === 'dir') scanTypes($full);
    }
}
scanTypes('.');
./index.php => file
./images => dir
./images/logo.png => file
Фильтрация по типу с помощью итератора

Использование с RecursiveDirectoryIterator для отбора определённых типов.

Пример php
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('.')
);
foreach ($iterator as $file) {
    if (filetype($file->getPathname()) === 'file') {
        echo 'Файл: ' . $file->getFilename() . PHP_EOL;
    }
}
Файл: index.php
Файл: style.css
Проверка специальных типов файлов

Пример для FIFO (именованного канала).

Пример php
posix_mkfifo('/tmp/test.fifo', 0600);
echo filetype('/tmp/test.fifo');
unlink('/tmp/test.fifo');
fifo
Сравнение с языками Python, JavaScript и MySQL

Filetype в Python

В Python применяются функции модуля os.path для проверки типа:

import os
print(os.path.isfile('data.txt'))
print(os.path.isdir('projects'))
print(os.path.islink('shortcut'))
True
True
True
JavaScript (Node.js)

В Node.js используется модуль fs и метод stat или lstat:

const fs = require('fs');
try {
  const stats = fs.statSync('app.js');
  console.log(stats.isFile());
  console.log(stats.isDirectory());
} catch (err) {
  console.log('Файл не найден');
}
true
false

Filetype в MySQL

В MySQL нет прямой аналогии. Функция LOAD_FILE() читает содержимое файла, но не сообщает его тип.

PHP filetype function comments

En
Filetype Gets file type