44、PHP 原生魅力 - 文件操作 - 文件信息
使用 stat() 函数,可以检索关于一个文件的信息和统计。
参数是文件名,它返回一个包含一些信息的关联数组:
- dev:设备号
- ino:inode 号
- mode:包含多个函数读取的信息。当以八进制形式表示时,从右开始,chmod() 函数返回前三位。PHP 忽略接下来的一位。后面的两位数字表示文件类型
- nlink:链接数
- uid, gid:用户 ID 和组 ID
- rdev:设备类型
- size:字节大小
- atime:最后访问时间(Unix 时间戳)
- mtime:最后修改时间(Unix 时间戳)
- ctime:最后inode更改时间(Unix 时间戳)
- blksize:块大小
- blocks:分配的块数
我大量使用 mode、uid、gid、size 和 mtime 这些信息。
<?php
$file = 'test.txt';
print_r(stat($file));
输出如下:
$ php 44-stat.php
Array
(
[0] => 66309
[1] => 21765658
[2] => 33277
[3] => 1
[4] => 1000
[5] => 1000
[6] => 0
[7] => 0
[8] => 1717514427
[9] => 1717514427
[10] => 1717514803
[11] => 4096
[12] => 0
[dev] => 66309
[ino] => 21765658
[mode] => 33277
[nlink] => 1
[uid] => 1000
[gid] => 1000
[rdev] => 0
[size] => 0
[atime] => 1717514427
[mtime] => 1717514427
[ctime] => 1717514803
[blksize] => 4096
[blocks] => 0
)
如果 mode 值是以八进制格式表示的,你将看到 7 个字符。
- 第一个字符是 0
- 第二和第三个字符表示文件类型
- 第四个字符是 0
- 第五、六、七个字符表示文件权限
对于文件类型:
-
0140xxx
:套接字(socket) -
0120xxx
:链接(link) -
0100xxx
:普通文件(regular file) -
0060xxx
:块设备文件(block file) -
0040xxx
:目录(directory) -
0020xxx
:字符设备文件(character device) -
0010xxx
:命名管道(FIFO)
为了仅提取表示文件类型的比特,你可以使用位掩码,例如:$filestat['mode'] & 0xF000
<?php
$file = 'test.txt';
$filestat = stat($file);
var_dump(sprintf("%'07o",$filestat['mode'] & 0xF000));
输出如下:
$ php 44-stat.php
string(7) "0100000"
我有一个匿名函数来以一种更具描述性的方式检索文件类型,使用匹配构造函数:
<?php
$getinfo = function($filename) {
$filestat = stat($filename);
var_dump(sprintf("%'07o",$filestat['mode'] & 0xF000));
return match ($filestat['mode'] & 0xF000) {
0xC000 => 'socket',
0xA000 => 'symbolic link',
0x8000 => 'regular',
0x6000 => 'block special',
0x4000 => 'directory',
0x2000 => 'character special',
0x1000 => 'fifo pipe',
default => 'unknown file',
};
};
echo $getinfo(__FILE__) . PHP_EOL;
echo $getinfo(__DIR__) . PHP_EOL;
输出如下:
$ php 44-stat.php
string(7) "0100000"
regular
string(7) "0040000"
directory
符号链接信息
符号链接是链接到真实的文件的特殊文件。
如果对符号链接文件使用 stat() 函数,则将获得有关目标文件(符号链接所链接的文件)的信息。但是,如果您想获得有关符号链接的信息,请使用 lstat() 函数。
<?php
$filestat = lstat($filename);
var_dump(sprintf("%'07o",$filestat['mode'] & 0xF000));
请登录后再评论