Способы извлечения свойств файла в языке PHP: инструкции и примеры

Раздел: Работа с файлами в PHP -> Операции с файловой системой

Основные способы получения информации о файле

Наиболее полную информацию о файле в PHP возвращает функция stat(). Она возвращает массив с числовыми и строковыми ключами, содержащий размер, время последнего доступа, модификации и изменения inode, права доступа, идентификаторы владельца и группы, количество жёстких ссылок и другие данные. Эта функция подходит для детального анализа любого файла или символической ссылки.


<?php
$file = 'example.txt';
if (file_exists($file)) {
    $info = stat($file);
    echo 'Размер: ' . $info['size'] . ' байт' . PHP_EOL;
    echo 'Последняя модификация: ' . date('Y-m-d H:i:s', $info['mtime']) . PHP_EOL;
    echo 'Права: ' . decoct($info['mode']) . PHP_EOL;
} else {
    echo 'Файл не найден.';
}
?>

Php редактировать файл (редактирование содержимого файла в php)

Размер: 1024 байт
Последняя модификация: 2025-03-15 12:30:00
Права: 100644

Php заменить файл (замена содержимого файла в php (перезапись))

Примечание: Ключ 'mode' включает тип файла и права доступа. Для получения только прав используется fileperms().

Для быстрого получения отдельных атрибутов существуют специализированные функции: filesize(), filemtime(), fileatime(), filectime(), fileowner(), filegroup(), fileperms(). Они удобны, когда требуется только одно значение, и не нагружают память лишними данными.


<?php
$file = 'document.pdf';
echo 'Размер: ' . filesize($file) . ' байт' . PHP_EOL;
echo 'Время последнего изменения: ' . date('d.m.Y H:i:s', filemtime($file));
?>

Php получить имя файла (получение имени файла из пути в php)

Размер: 245760 байт
Время последнего изменения: 28.02.2025 09:15:42

Php информация о файле (получение информации о файле в php)

Как получить информацию о файле с помощью объектно-ориентированного подхода?

Класс SplFileInfo предоставляет удобный интерфейс для получения информации о файле. Он поддерживает методы getSize(), getMTime(), getPerms(), getOwner(), getGroup(), а также позволяет проверить тип файла (isFile(), isDir(), isLink()). Этот вариант удобен при работе с коллекциями файлов в итераторах.


<?php
$fileInfo = new SplFileInfo('image.png');
echo 'Имя: ' . $fileInfo->getFilename() . PHP_EOL;
echo 'Размер: ' . $fileInfo->getSize() . ' байт' . PHP_EOL;
echo 'Расширение: ' . $fileInfo->getExtension() . PHP_EOL;
echo 'Последний доступ: ' . date('Y-m-d H:i:s', $fileInfo->getATime()) . PHP_EOL;
?>

Php переименовать файл (переименование файла в php)

Имя: image.png
Размер: 350000 байт
Расширение: png
Последний доступ: 2025-03-10 18:22:15

Как разобрать путь на составные части без лишних вызовов файловой системы?

Функция pathinfo() анализирует строку пути и возвращает массив с ключами dirname, basename, extension, filename. Она не обращается к диску, поэтому быстра и безопасна для несуществующих файлов. Используется, например, для извлечения расширения или имени без полного пути.


<?php
$path = '/var/www/html/index.php';
$info = pathinfo($path);
echo 'Каталог: ' . $info['dirname'] . PHP_EOL;
echo 'Имя файла: ' . $info['filename'] . PHP_EOL;
echo 'Расширение: ' . $info['extension'] . PHP_EOL;
echo 'Базовое имя: ' . $info['basename'] . PHP_EOL;
?>
Каталог: /var/www/html
Имя файла: index
Расширение: php
Базовое имя: index.php

Как определить MIME-тип файла (например, для проверки загрузки)?

Расширение файла не гарантирует его истинный тип. Для определения MIME-типа по содержимому используется расширение fileinfo (функция finfo_open() и finfo_file()). Это надёжный способ распознать изображение, документ и другие форматы.


<?php
$file = 'uploaded_file.jpg';
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file);
finfo_close($finfo);
echo 'MIME-тип: ' . $mime;
?>
MIME-тип: image/jpeg

Если расширение fileinfo не установлено, можно использовать mime_content_type() (устаревшая, но всё ещё работает).

Как узнать, является ли файл символической ссылкой, и получить её цель?

Функция is_link() проверяет, является ли объект ссылкой, а readlink() возвращает путь, на который она указывает. При работе с ссылками обычные функции (filesize, filemtime) возвращают данные целевого файла. Для получения информации о самой ссылке используется lstat().


<?php
$link = 'symlink_to_config';
if (is_link($link)) {
    echo 'Цель ссылки: ' . readlink($link) . PHP_EOL;
    $info = lstat($link);
    echo 'Размер ссылки (самой): ' . $info['size'] . ' байт';
} else {
    echo 'Это не ссылка.';
}
?>
Цель ссылки: /etc/config.ini
Размер ссылки (самой): 17 байт

Типичные ошибки и их решение:

  • Файл не существует. Функции stat(), filesize() и другие возвращают false и генерируют предупреждение. Перед вызовом следует использовать file_exists() или is_file().
  • Проблемы с правами доступа. Если PHP не имеет прав на чтение файла или каталога, функции могут вернуть false или неверные данные. Проверка is_readable() помогает избежать ошибок.
  • Относительные пути. Поведение зависит от текущей рабочей директории (getcwd()). Лучше использовать абсолютные пути или константу __DIR__.
  • Старые значения из кеша stat. PHP кеширует результаты stat() в течение времени жизни скрипта. Для принудительного обновления используется clearstatcache().
  • Ошибки при работе с большими файлами. filesize() на 32-битных системах может вернуть неверное значение для файлов более 2 ГБ. В таких случаях лучше использовать stat() или SplFileInfo::getSize(), которые корректно обрабатывают большие размеры.

Ниже приведены расширенные примеры, демонстрирующие возможности получения информации о файлах в PHP.

Рекурсивный обход директории с выводом информации о каждом файле

Пример

<?php
function scanDirectory(string $dir): void {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            echo $file->getPathname() . PHP_EOL;
            echo '  Размер: ' . $file->getSize() . ' байт' . PHP_EOL;
            echo '  Изменён: ' . date('Y-m-d H:i:s', $file->getMTime()) . PHP_EOL;
            echo '  MIME: ' . mime_content_type($file->getPathname()) . PHP_EOL;
            echo '  Права: ' . substr(sprintf('%o', $file->getPerms()), -4) . PHP_EOL;
            echo PHP_EOL;
        }
    }
}
scanDirectory('/home/user/docs');
?>
/home/user/docs/readme.txt
  Размер: 2048 байт
  Изменён: 2025-01-20 14:30:00
  MIME: text/plain
  Права: 0644

/home/user/docs/photo.jpg
  Размер: 1500000 байт
  Изменён: 2025-02-10 10:15:22
  MIME: image/jpeg
  Права: 0644

Сравнение времени модификации двух файлов

Пример

<?php
$file1 = 'backup_old.sql';
$file2 = 'backup_new.sql';
if (filemtime($file1) > filemtime($file2)) {
    echo $file1 . ' новее, чем ' . $file2;
} elseif (filemtime($file1) < filemtime($file2)) {
    echo $file2 . ' новее, чем ' . $file1;
} else {
    echo 'Оба файла имеют одинаковое время модификации.';
}
?>
backup_new.sql новее, чем backup_old.sql

Получение информации о файле с помощью SplFileInfo в цикле (массив имён)

Пример

<?php
$files = ['readme.txt', 'script.php', 'image.png'];
foreach ($files as $name) {
    $info = new SplFileInfo($name);
    printf("%-20s %10d байт %s\n",
        $info->getFilename(),
        $info->getSize(),
        date('Y-m-d', $info->getMTime())
    );
}
?>
readme.txt                2048 байт 2025-01-15
script.php               4096 байт 2025-03-01
image.png              350000 байт 2025-02-28

Декодирование прав доступа (fileperms) в читаемый вид

Пример

<?php
function getPermsString(int $perms): string {
    $result = '';
    $types = ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'];
    $result .= ($perms & 0x4000) ? 'd' : '-';
    $result .= $types[($perms >> 6) & 7];
    $result .= $types[($perms >> 3) & 7];
    $result .= $types[$perms & 7];
    return $result;
}

$perms = fileperms('file.txt');
echo getPermsString($perms) . ' (' . decoct($perms & 07777) . ')';
?>
-rw-r--r-- (644)

Получение общего размера всех файлов в директории (рекурсивно)

Пример

<?php
function getDirectorySize(string $dir): int {
    $size = 0;
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            $size += $file->getSize();
        }
    }
    return $size;
}

$dir = '/var/log';
echo 'Общий размер логов: ' . getDirectorySize($dir) . ' байт';
?>
Общий размер логов: 54789120 байт

Работа с символическими ссылками: lstat и readlink

Пример

<?php
$symlink = 'current_version';
if (is_link($symlink)) {
    $lstat = lstat($symlink);
    echo 'Ссылка создана: ' . date('Y-m-d H:i:s', $lstat['mtime']) . PHP_EOL;
    echo 'Размер ссылки: ' . $lstat['size'] . ' байт' . PHP_EOL;
    echo 'Цель: ' . readlink($symlink) . PHP_EOL;
    
    // сравнение с stat целевого файла
    $target = readlink($symlink);
    if (file_exists($target)) {
        $stat = stat($target);
        echo 'Целевой файл размером: ' . $stat['size'] . ' байт';
    }
}
?>
Ссылка создана: 2025-03-12 08:45:00
Размер ссылки: 28 байт
Цель: /usr/local/bin/app_v2
Целевой файл размером: 22000000 байт

Определение реального пути и типа файла (файл, директория, ссылка)

Пример

<?php
$path = 'some_path';
$real = realpath($path);
if ($real === false) {
    echo 'Путь не существует.';
} else {
    echo 'Реальный путь: ' . $real . PHP_EOL;
    if (is_dir($real)) {
        echo 'Это директория.';
    } elseif (is_file($real)) {
        echo 'Это файл.';
    } elseif (is_link($real)) {
        echo 'Это символическая ссылка.';
    }
}
?>
Реальный путь: /var/www/some_path
Это файл.

Получение информации о файле в PHP - comments

En
Php информация о файле (php)