这是一个基于
许多用户提交的代码片段和
@ http://www.askapache.com/security/chmod-stat.html 的增强版“stat”函数。
给它一个文件名,它将返回一个类似于 stat 的数组。
<?php
function alt_stat($file) {
clearstatcache();
$ss=@stat($file);
if(!$ss) return false; //无法获取文件状态
$ts=array(
0140000=>'ssocket',
0120000=>'llink',
0100000=>'-file',
0060000=>'bblock',
0040000=>'ddir',
0020000=>'cchar',
0010000=>'pfifo'
);
$p=$ss['mode'];
$t=decoct($ss['mode'] & 0170000); // 文件类型位
$str =(array_key_exists(octdec($t),$ts))?$ts[octdec($t)]{0}:'u';
$str.=(($p&0x0100)?'r':'-').(($p&0x0080)?'w':'-');
$str.=(($p&0x0040)?(($p&0x0800)?'s':'x'):(($p&0x0800)?'S':'-'));
$str.=(($p&0x0020)?'r':'-').(($p&0x0010)?'w':'-');
$str.=(($p&0x0008)?(($p&0x0400)?'s':'x'):(($p&0x0400)?'S':'-'));
$str.=(($p&0x0004)?'r':'-').(($p&0x0002)?'w':'-');
$str.=(($p&0x0001)?(($p&0x0200)?'t':'x'):(($p&0x0200)?'T':'-'));
$s=array(
'perms'=>array(
'umask'=>sprintf("%04o",@umask()),
'human'=>$str,
'octal1'=>sprintf("%o", ($ss['mode'] & 000777)),
'octal2'=>sprintf("0%o", 0777 & $p),
'decimal'=>sprintf("%04o", $p),
'fileperms'=>@fileperms($file),
'mode1'=>$p,
'mode2'=>$ss['mode']),
'owner'=>array(
'fileowner'=>$ss['uid'],
'filegroup'=>$ss['gid'],
'owner'=>
(function_exists('posix_getpwuid'))?
@posix_getpwuid($ss['uid']):'',
'group'=>
(function_exists('posix_getgrgid'))?
@posix_getgrgid($ss['gid']):''
),
'file'=>array(
'filename'=>$file,
'realpath'=>(@realpath($file) != $file) ? @realpath($file) : '',
'dirname'=>@dirname($file),
'basename'=>@basename($file)
),
'filetype'=>array(
'type'=>substr($ts[octdec($t)],1),
'type_octal'=>sprintf("%07o", octdec($t)),
'is_file'=>@is_file($file),
'is_dir'=>@is_dir($file),
'is_link'=>@is_link($file),
'is_readable'=> @is_readable($file),
'is_writable'=> @is_writable($file)
),
'device'=>array(
'device'=>$ss['dev'], //设备
'device_number'=>$ss['rdev'], //设备号,如果是设备。
'inode'=>$ss['ino'], //文件序列号
'link_count'=>$ss['nlink'], //链接计数
'link_to'=>($s['type']=='link') ? @readlink($file) : ''
),
'size'=>array(
'size'=>$ss['size'], //文件大小,以字节为单位。
'blocks'=>$ss['blocks'], //分配的512字节块数
'block_size'=> $ss['blksize'] //I/O 的最佳块大小。
),
'time'=>array(
'mtime'=>$ss['mtime'], //上次修改时间
'atime'=>$ss['atime'], //上次访问时间。
'ctime'=>$ss['ctime'], //上次状态更改时间
'accessed'=>@date('Y M D H:i:s',$ss['atime']),
'modified'=>@date('Y M D H:i:s',$ss['mtime']),
'created'=>@date('Y M D H:i:s',$ss['ctime'])
),
);
clearstatcache();
return $s;
}
?>
|=---------[ 示例输出 ]
Array(
[perms] => Array
(
[umask] => 0022
[human] => -rw-r--r--
[octal1] => 644
[八进制] => 0644
[十进制] => 100644
[文件权限] => 33188
[模式1] => 33188
[模式2] => 33188
)
[文件类型] => 数组
(
[类型] => 文件
[类型(八进制)] => 0100000
[是否为文件] => 1
[是否为目录] =>
[是否为链接] =>
[是否可读] => 1
[是否可写] => 1
)
[所有者] => 数组
(
[文件所有者] => 035483
[文件组] => 23472
[所有者名称] => askapache
[组名称] => grp22558
)
[文件] => 数组
(
[文件名] => /home/askapache/askapache-stat/htdocs/ok/g.php
[真实路径] =>
[目录名] => /home/askapache/askapache-stat/htdocs/ok
[文件名] => g.php
)
[设备] => 数组
(
[设备] => 25
[设备号] => 0
[索引节点号] => 92455020
[链接计数] => 1
[链接目标] =>
)
[大小] => 数组
(
[大小] => 2652
[块数] => 8
[块大小] => 8192
)
[时间] => 数组
(
[修改时间] => 1227685253
[访问时间] => 1227685138
[状态改变时间] => 1227685253
[上次访问时间] => 2008年11月20日 23:38:58
[上次修改时间] => 2008年11月20日 23:40:53
[创建时间] => 2008年11月20日 23:40:53
)
)