Stat: примеры (PHP)
stat(string filename): array|falseФункция stat возвращает информацию о файле или символической ссылке. Она применяется для получения метаданных: размера, времени модификации, прав доступа и других атрибутов файловой системы.
Функция принимает один обязательный параметр:
- filename (string) - путь к файлу или символической ссылке.
Возвращает индексированный массив с 13 элементами и числовыми ключами от 0 до 12, а также ассоциативные ключи. При ошибке возвращает false.
| Индекс | Ассоциативный ключ | Описание |
|---|---|---|
| 0 | dev | Номер устройства |
| 1 | ino | Номер inode |
| 2 | mode | Режим защиты inode |
| 3 | nlink | Количество ссылок |
| 4 | uid | Идентификатор владельца |
| 5 | gid | Идентификатор группы |
| 6 | rdev | Тип устройства |
| 7 | size | Размер в байтах |
| 8 | atime | Время последнего доступа (Unix timestamp) |
| 9 | mtime | Время последней модификации |
| 10 | ctime | Время последнего изменения inode |
| 11 | blksize | Размер блока ввода-вывода |
| 12 | blocks | Количество выделенных блоков |
<?php
$info = stat('example.txt');
print_r($info);
?>Array
(
[0] => 2050
[1] => 1234567
[2] => 33188
[3] => 1
[4] => 1000
[5] => 1000
[6] => 0
[7] => 1024
[8] => 1678901234
[9] => 1678901200
[10] => 1678901100
[11] => 4096
[12] => 8
[dev] => 2050
[ino] => 1234567
[mode] => 33188
[nlink] => 1
[uid] => 1000
[gid] => 1000
[rdev] => 0
[size] => 1024
[atime] => 1678901234
[mtime] => 1678901200
[ctime] => 1678901100
[blksize] => 4096
[blocks] => 8
)<?php
if ($stat = stat('example.txt')) {
echo "Файл существует, размер: " . $stat['size'] . " байт";
} else {
echo "Файл не найден";
}
?>Файл существует, размер: 1024 байт
<?php
$stat = stat('example.txt');
if ($stat['mode'] & 0xC000 === 0xC000) {
echo "Сокет";
} elseif ($stat['mode'] & 0xA000 === 0xA000) {
echo "Символическая ссылка";
} elseif ($stat['mode'] & 0x8000 === 0x8000) {
echo "Обычный файл";
}
?>Обычный файл
Работает аналогично stat, но для символических ссылок возвращает информацию о самой ссылке, а не о целевом файле.
Принимает файловый дескриптор вместо пути к файлу. Используется для уже открытых файлов.
Возвращают отдельные метки времени файла. Эффективнее при необходимости получить только один атрибут.
Возвращает только размер файла в байтах. Проще в использовании для получения размера.
Очищает кеш состояния файлов. Требуется после многократных проверок одного файла.
<?php
$stat = stat('несуществующий_файл.txt');
echo $stat['size']; // Предупреждение и ошибка
?>Warning: stat(): stat failed for несуществующий_файл.txt Notice: Trying to access array offset on value of type bool
<?php
$stat1 = stat('example.txt');
// Файл изменяется другим процессом
$stat2 = stat('example.txt'); // Может вернуть закешированные данные
?>Решение - использовать clearstatcache() между вызовами.
<?php
$stat = stat('example.txt');
if ($stat['mode'] == 0644) { // Неправильно
echo "Права 0644";
}
?>Правильный подход - маскирование битов: ($stat['mode'] & 0777) === 0644.
Функция теперь возвращает более точные ошибки при невозможности получить информацию о файле. Улучшена обработка символических ссылок на Windows.
Добавлена поддержка обработки путей длиной более 260 символов на Windows при использовании соответствующих настроек.
В PHP 5 до версии 5.3 существовали различия в обработке символических ссылок между Windows и Unix-системами.
<?php
function file_changed($filename) {
static $last_mtime = 0;
$stat = stat($filename);
if (!$stat) return false;
if ($stat['mtime'] > $last_mtime) {
$last_mtime = $stat['mtime'];
return true;
}
return false;
}
// Использование
if (file_changed('config.ini')) {
echo "Файл конфигурации изменен, перезагружаем настройки";
}
?><?php
function dir_size($path) {
$total = 0;
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path)
);
foreach ($files as $file) {
if ($file->isFile()) {
$stat = stat($file->getPathname());
if ($stat) $total += $stat['size'];
}
}
return $total;
}
echo "Размер директории: " . dir_size('/var/log') . " байт";
?><?php
$stat = stat('/');
$block_size = $stat['blksize'];
$blocks = $stat['blocks'];
$disk_usage = $blocks * $block_size;
echo "Занято места: " .
round($disk_usage / (1024*1024), 2) . " MB";
?><?php
$file1 = 'version1.txt';
$file2 = 'version2.txt';
$stat1 = stat($file1);
$stat2 = stat($file2);
if ($stat1 && $stat2) {
if ($stat1['mtime'] > $stat2['mtime']) {
echo "$file1 новее";
} else {
echo "$file2 новее";
}
}
?>Stat в Python
import os
stat_info = os.stat('example.txt')
print(f"Размер: {stat_info.st_size} байт")
print(f"Время модификации: {stat_info.st_mtime}")Размер: 1024 байт Время модификации: 1678901200.0
const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
console.log(`Размер: ${stats.size} байт`);
console.log(`Время создания: ${stats.birthtime}`);
});Размер: 1024 байт Время создания: 2023-03-16T12:33:20.000Z
stat example.txtFile: example.txt Size: 1024 Blocks: 8 IO Block: 4096 regular file Device: 2050d/8270d Inode: 1234567 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ group) Access: 2023-03-16 12:33:54.000000000 +0300 Modify: 2023-03-16 12:33:20.000000000 +0300 Change: 2023-03-16 12:31:40.000000000 +0300