Lstat: примеры (PHP)
lstat(string $filename): array|falseФункция lstat() в PHP используется для получения информации о файле или символической ссылке. В отличие от функции stat(), она возвращает данные о самой символической ссылке, а не о файле, на который эта ссылка указывает.
Использование функции актуально при необходимости работы с символическими ссылками в файловой системе. Она помогает определить, является ли элемент файлом или ссылкой, а также получить его метаданные.
Функция принимает один обязательный параметр:
- $filename (string) - путь к файлу или символической ссылке для анализа.
Возвращает проиндексированный массив со статистикой или false в случае ошибки. Структура массива идентична возвращаемой функцией stat().
<?php
$result = lstat('/path/to/file.txt');
print_r($result);
?>Array
(
[0] => 2065
[1] => 15
[2] => 33188
[3] => 1
[4] => 1000
[5] => 1000
[6] => 0
[7] => 1024
[8] => 1633040000
[9] => 1633040000
[10] => 1633040000
[11] => 4096
[12] => 8
[dev] => 2065
[ino] => 15
[mode] => 33188
[nlink] => 1
[uid] => 1000
[gid] => 1000
[rdev] => 0
[size] => 1024
[atime] => 1633040000
[mtime] => 1633040000
[ctime] => 1633040000
[blksize] => 4096
[blocks] => 8
)<?php
// Создаем ссылку для примера
symlink('/path/to/target.txt', '/path/to/link');
$linkInfo = lstat('/path/to/link');
echo 'Размер ссылки: ' . $linkInfo['size'] . ' байт';
?>Размер ссылки: 15 байт
- stat() - возвращает информацию о файле, но для символических ссылок анализирует конечный файл.
- fstat() - работает с открытым файловым указателем (дескриптором).
- filemtime(), filesize() - возвращают отдельные метаданные файла.
- is_link() - проверяет, является ли путь символической ссылкой.
Функцию lstat() предпочтительнее использовать при работе с символическими ссылками, когда нужны данные именно о ссылке, а не о целевом объекте.
<?php
$result = lstat('/несуществующий/путь');
var_dump($result);
?>bool(false)
<?php
// При попытке анализа файла без прав на чтение
$result = @lstat('/root/.bashrc');
if ($result === false) {
echo 'Ошибка получения информации';
}
?>Ошибка получения информации
<?php
$result = lstat('');
var_dump($result);
?>bool(false)
В PHP 8 значительных изменений в работе функции lstat() не произошло. Основное поведение сохранилось с предыдущих версий.
В PHP 7.4 и более ранних версиях функция также работала стабильно. Важно учитывать, что в Windows символические ссылки до PHP 7.2 обрабатывались с ограничениями.
<?php
touch('target.txt');
symlink('target.txt', 'link.txt');
$lstat = lstat('link.txt');
$stat = stat('link.txt');
echo 'lstat size: ' . $lstat['size'] . '\n';
echo 'stat size: ' . $stat['size'] . '\n';
unlink('link.txt');
unlink('target.txt');
?>lstat size: 10 stat size: 0
<?php
function checkType($path) {
$stat = lstat($path);
if (!$stat) return 'Ошибка';
$mode = $stat['mode'];
if (($mode & 0xC000) === 0xC000) return 'Сокет';
elseif (($mode & 0xA000) === 0xA000) return 'Ссылка';
elseif (($mode & 0x8000) === 0x8000) return 'Файл';
elseif (($mode & 0x6000) === 0x6000) return 'Блочное устройство';
elseif (($mode & 0x4000) === 0x4000) return 'Директория';
elseif (($mode & 0x2000) === 0x2000) return 'Символьное устройство';
elseif (($mode & 0x1000) === 0x1000) return 'FIFO';
return 'Неизвестно';
}
echo checkType('link.txt');
?>Ссылка
<?php
$link = 'dynamic_link';
$target = 'dynamic_target.txt';
touch($target);
symlink($target, $link);
$initial = lstat($link)['size'];
file_put_contents($target, 'Новые данные');
rename($target, $target . '_new');
symlink($target . '_new', $link);
$new = lstat($link)['size'];
echo 'Изменение размера ссылки: ' . ($new - $initial) . ' байт';
unlink($link);
unlink($target . '_new');
?>Изменение размера ссылки: 4 байт
Lstat в Python
Функция os.lstat() модуля os работает аналогично.
import os
stat_info = os.lstat('/path/to/link')
print(stat_info.st_size)15
Используется fs.lstat() или fs.lstatSync().
const fs = require('fs');
fs.lstat('/path/to/link', (err, stats) => {
console.log(stats.size);
});Команда stat -L получает информацию о файле, а без флага -L - о ссылке.
stat -c%s /path/to/link15