除了能够查看并获得与目录有关的信息外,我们还可以获取Web服务器上文件的信息,并且与这些文件进行交互。前面我们已经了解了如何读文件和写文件。我们还可以使用许多其他的文件函数。
19.3.1 获取文件信息
我们可以对目录浏览器脚本的部分内容进行修改,使其能够读取文件,如下所示:
while(false!==($file=readdir($dir))){
echo'<a href="filedetails.php?file='.$file.'”>'.$file.'</a><br>';
}
这样,我们就可以创建脚本filedetails.php,用来提供与文件相关的详细信息。这个文件的内容如程序清单19-6所示。
使用该脚本的警告:Windows下不支持或者不可靠地支持这里所使用的一些函数,包括posix_getpwuid函数、fileowner函数和filegroup函数。
程序清单19-6 filedetails.php——文件状态函数和它们的运行结果
<html>
<head>
<title>File Details</title>
</head>
<body>
<?php
$current_dir='/uploads/';
$file=basename($file);//strip off directory information for security
echo'<h1>Details of file:'.$file.'</h1>';
echo'<h2>File data</h2>';
echo'File last accessed:'.date('j F Y H:i',fileatime($file)).'<br>';
echo'File last modified:'.date('j F Y H:i',filemtime($file)).'<br>';
$user=posix_getpwuid(fileowner($file));
echo'File owner:'.$user['name'].'<br>';
$group=posix_getgrgid(filegroup($file));
echo'File group:'.$group['name'].'<br>';
echo'File permissions:'.decoct(fileperms($file)).'<br>';
echo'File type:'.filetype($file).'<br>';
echo'File size:'.filesize($file).'bytes<br>';
echo'<h2>File tests</h2>';
echo'is_dir:'.(is_dir($file)?'true':'false').'<br>';
echo'is_executable:'.(is_executable($file)?'true':'false').'<br>';
echo'is_file:'.(is_file($file)?'true':'false').'<br>';
echo'is_link:'.(is_link($file)?'true':'false').'<br>';
echo'is_readable:'.(is_readable($file)?'true':'false').'<br>';
echo'is_writable:'.(is_writable($file)?'true':'false').'<br>';
?>
</body>
</html>
程序清单19-6运行的结果如图19-4所示。
图 19-4 文件内容视图显示关于一个文件的系统信息。请注意显示的权限码是用八进制表示的现在,我们讨论一下程序清单19-6中所用到的函数所实现的功能。正如前面所提到的,函数basename获得的是不带目录的文件名(也可以使用函数dirname获得不带文件名称的目录名称)。
函数fileatime和filemtime将分别返回该文件最近被访问和最近被修改的时间戳。可以通过函数date来重新格式化时间戳,这样使得它具有更好的可读性。在一些操作系统中,这些函数将返回同样的值(如这个例子中),这取决于系统所存储的信息。
函数fileowner和filegroup将分别返回文件的用户标识(uid)和组标识(gid)。通过分别使用函数posix_getpwuid和posix_getgrgid,我们将它们转变成容易理解的名字。这些函数将uid或gid作为参数,并返回关于用户或者组的相关数组,包括该脚本用到的用户或组的名字。
函数fileperms返回文件权限码。我们可以使用函数decoct将权限码重新格式化为八进制数,该格式对于UNIX用户来说非常熟悉。
函数filetype返回一些关于所检查文件的类型信息。可能的结果有fifo、char、dir、block、link、file和unknown。
函数filesize返回文件的大小(以字节计算)。
另一组函数——is_dir、is_executable、is_file、is_link、is_readable和is_writable——每一个函数都将检测一个文件的指定属性并返回true或false。
或者,也可以通过函数stat获得许多同样的信息。当传递给此函数一个文件名时,它将返回与上述函数组所返回的数据类似的数组。函数lstat也与之类似,但是仅用于符号链接文件。
所有的文件状态函数的运行都很费时间。因此它们的结果将被缓存起来。如果要在变化之前或者变化之后检查文件信息,需要调用函数:
clearstatcache;
来清除以前的缓存结果。如果希望在改变文件数据之前或者之后使用以前的脚本,应该先调用此函数来更新产生的数据。