19.2 使用目录函数
在用户上传一些文件之后,能够看到所上传的文件,并可以操作这些文件的内容对他们来说是非常必要的。PHP提供了一系列目录函数与文件系统函数,它们都是实现此功能的非常有用的工具。
19.2.1 从目录读取
首先,我们将实现一个能够浏览所上传文件的目录的脚本。在PHP中,浏览目录实际上是非常简单的。在程序清单19-3中,我们给出了能够实现此功能的示例脚本。
程序清单19-3 browsedir.php——能够列出上传文件的目录
<html>
<head>
<title>Browse Directories</title>
</head>
<body>
<h1>Browsing</h1>
<?php
$current_dir='/uploads/';
$dir=opendir($current_dir);
echo"<p>Upload directory is$current_dir</p>";
echo'<p>Directory Listing:</p><ul>';
while(false!==($file=readdir($dir)))
{
//strip out the two entries of.and..
if($file!="."&&$file!="..")
{
echo"<li>$file</li>";
}
}
echo'</ul>';
closedir($dir);
?>
</body>
</html>
以上脚本使用了函数opendir()、closedir()和readdir()。
函数opendir()用于打开所浏览的目录。这类似于用函数fopen()打开所读取的文件。只是传递给此函数的参数不是文件名称,而是一个目录名称:
$dir=opendir($current_dir);
该函数将返回一个目录句柄,这一点与函数fopen()返回文件句柄是非常类似的。
在目录打开后,可以通过调用函数readdir($dir)从目录中读取文件,正如本例所示。当该目录中没有可读的文件时,此函数将返回false。请注意,当此函数读取一个名为“0”的文件时,也将返回false——为了确保这一点,可以通过测试来确定返回值是否为false。
while(false!==($file=readdir($dir)))
当完成从目录中读取文件的步骤后,可以通过调用函数closedir($dir)关闭该目录,这也类似于调用函数fclose()来关闭文件。
图19-3所示的是目录浏览脚本的输出示例。
图 19-3 目录清单列出了指定目录中的所有文件
通常,.(当前目录)和..(上一级)目录也会显示在图19-3所示的清单中。但是,我们使用了如下所示的语句将它们过滤了:
if($file!="."&&$file!="..")
如果删除了这行代码,.(当前目录)和..(上一级)目录就会出现在目录清单中。
如果通过这种机制提供浏览目录的功能,那么限制可浏览的目录是很明智的,因为这样用户就不能够浏览特殊的目录列表。
在这里,一个相关的并且是非常实用的函数是rewinddir($dir),此函数将所读的文件恢复到开始的目录。
除了这些函数外,还可以使用PHP提供的dir类,该类具有handle和path属性,以及read()、close()和rewind()方法,它们与以上所介绍的非类函数有着相同的作用。
在程序清单19-4中,我们使用dir类重新编写了以上示例。
程序清单19-4 browsedir2.php——使用dir类显示目录列表
<html>
<head>
<title>Browse Directories</title>
</head>
<body>
<h1>Browsing</h1>
<?php
$dir=dir("/uploads/");
echo"<p>Handle is$dir->handle</p>";
echo"<p>Upload directory is$dir->path</p>";
echo'<p>Directory Listing:</p><ul>';
while(false!==($file=$dir->read()))
//strip out the two entries of.and..
if($file!="."&&$file!="..")
{
echo"<li>$file</li>";
}
echo'</ul>';
$dir->close();
?>
</body>
</html>
以上示例中的文件名称并没有以任何顺序保存,因此如果需要一个有序列表,你可以使用scandir()函数,该函数是在PHP 5中引入的。这个函数可以将文件名称保存在一个数组,并且以字母表的顺序排序,升序或降序,如程序清单19-5所示。
程序清单19-5 scardir.php——使用scandri()函数对文件名称进行字母表方式排序
<html>
<head>
<title>Browse Directories</title>
</head>
<body>
<h1>Browsing</h1>
<?php
$dir='/uploads/';
$files1=scandir($dir);
$files2=scandir($dir,1);
echo"<p>Upload directory is$dir</p>";
echo'<p>Directory Listing in alphabetical order,ascending:</p><ul>';
foreach($files1 as$file)
{
if($file!="."&&$file!="..")
echo"<li>$file</li>";
}
echo'</ul>';
echo"<p>Upload directory is$dir</p>";
echo'<p>Directory Listing in alphabetical,descending:</p><ul>';
foreach($files2 as$file)
{
if($file!="."&&$file!="..")
echo"<li>$file</li>";
}
echo'</ul>';
?>
</body>
</html>