44、PHP 原生魅力 - 文件操作 - 文件信息

作者: 温新

图书: 【原生 PHP 魅力】

阅读: 174

时间: 2024-10-18 03:46:17

使用 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));
请登录后再评论