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

《PHP和MySQL Web开发(原书第4版)》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>