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.2 使用目录函数 - 图1

图 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>