首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》19.3 与文件系统的交互

关灯直达底部

除了能够查看并获得与目录有关的信息外,我们还可以获取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;

来清除以前的缓存结果。如果希望在改变文件数据之前或者之后使用以前的脚本,应该先调用此函数来更新产生的数据。