lstat() 函数返回关于文件或符号链接的信息。
这个函数会返回一个包含文件统计信息的数组。如果是符号链接,返回的是符号链接本身的信息,而不是链接指向的文件信息。
lstat ( string $filename ) : array|false
| 参数 | 类型 | 说明 |
|---|---|---|
filename |
字符串 | 文件或符号链接的路径 |
成功时返回一个包含文件统计信息的数组,失败时返回 false。
返回的数组包含以下元素:
| 数字下标 | 关联键名 | 说明 |
|---|---|---|
| 0 | dev | 设备号 |
| 1 | ino | inode 号 |
| 2 | mode | inode 保护模式 |
| 3 | nlink | 链接数 |
| 4 | uid | 所有者的用户ID |
| 5 | gid | 所有者的组ID |
| 6 | rdev | 设备类型(如果是 inode 设备) |
| 7 | size | 文件大小的字节数 |
| 8 | atime | 上次访问时间(Unix 时间戳) |
| 9 | mtime | 上次修改时间(Unix 时间戳) |
| 10 | ctime | 上次 inode 改变时间(Unix 时间戳) |
| 11 | blksize | 文件系统 I/O 的块大小 |
| 12 | blocks | 分配的 512 字节块数 |
<?php
$filename = 'example.txt';
// 创建一个文件
file_put_contents($filename, 'Hello World!');
// 使用 lstat() 获取文件信息
$info = lstat($filename);
if ($info !== false) {
echo "文件: $filename\n";
echo "大小: " . $info['size'] . " 字节\n";
echo "权限: " . decoct($info['mode'] & 0777) . "\n";
echo "用户ID: " . $info['uid'] . "\n";
echo "组ID: " . $info['gid'] . "\n";
echo "最后修改时间: " . date('Y-m-d H:i:s', $info['mtime']) . "\n";
echo "最后访问时间: " . date('Y-m-d H:i:s', $info['atime']) . "\n";
} else {
echo "无法获取文件信息\n";
}
// 清理
unlink($filename);
?>
<?php
$target = 'target_file.txt';
$link = 'link_to_target.txt';
// 创建目标文件
file_put_contents($target, '这是一个目标文件。');
// 创建符号链接
symlink($target, $link);
// 使用 lstat() 获取符号链接信息
$linkInfo = lstat($link);
echo "lstat() 结果(符号链接本身):\n";
echo "大小: " . $linkInfo['size'] . " 字节\n";
echo "inode: " . $linkInfo['ino'] . "\n\n";
// 使用 stat() 获取目标文件信息
$targetInfo = stat($target);
echo "stat() 结果(目标文件):\n";
echo "大小: " . $targetInfo['size'] . " 字节\n";
echo "inode: " . $targetInfo['ino'] . "\n\n";
// 比较 inode
if ($linkInfo['ino'] !== $targetInfo['ino']) {
echo "lstat() 和 stat() 返回不同的 inode,证明 lstat() 返回的是符号链接本身的信息。\n";
}
// 清理
unlink($link);
unlink($target);
?>
<?php
function getFileType($mode) {
$types = [
0010000 => '命名管道',
0020000 => '字符设备',
0040000 => '目录',
0060000 => '块设备',
0100000 => '普通文件',
0120000 => '符号链接',
0140000 => '套接字'
];
$fileType = $mode & 0170000; // 获取文件类型位
return $types[$fileType] ?? '未知类型';
}
$files = [
'regular.txt',
'/dev/null', // 字符设备(Linux)
'/tmp' // 目录
];
foreach ($files as $file) {
if (file_exists($file)) {
$info = lstat($file);
if ($info !== false) {
$type = getFileType($info['mode']);
$permissions = decoct($info['mode'] & 0777);
echo "$file:\n";
echo " 类型: $type\n";
echo " 权限: $permissions\n";
echo " inode: " . $info['ino'] . "\n\n";
}
}
}
?>
| 字段 | 详细说明 |
|---|---|
| dev | 文件所在的设备号。在 POSIX 系统中,每个文件系统都有一个唯一的设备号 |
| ino | inode 号。文件系统上文件的唯一标识符(Windows 上通常为 0) |
| mode | 文件模式,包含文件类型和权限。可以使用位掩码获取具体信息 |
| nlink | 硬链接数。普通文件通常为 1,目录有多个硬链接(包括 . 和 ..) |
| uid/gid | 所有者的用户 ID 和组 ID |
| size | 文件的字节大小。对于符号链接,返回的是链接路径的长度 |
| atime/mtime/ctime | 访问时间、修改时间和 inode 修改时间(不是创建时间) |