Способы извлечения свойств файла в языке 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 Это файл.