8.1常见的目录操作
8.1 常见的目录操作
目录是计算机文件系统的重要组成部分,可以将其看成是一种特殊的文件。本节将介绍一些和目录操作有关的PHP内置函数。
8.1.1 打开和关闭目录
要完成对目录的操作,首先要获取操作的目录句柄,即打开一个目录。所谓句柄,读者可以将其理解成目录的别名,或者理解成句柄代表的就是目录本身。PHP提供函数opendir()完成打开目录的操作,该函数的语法如下。
$dh = opendir(string $path);
参数$path是要打开的目录。如果处理成功,函数返回目录的句柄,否则函数返回FALSE。如果$path不是一个合法的目录或因为权限、文件系统等错误而无法打开目录,该函数也会返回FALSE。
对一个目录的操作结束之后,需要关闭已打开的目录,即释放操作目录时所占用的资源。PHP提供了函数closedir()完成关闭目录的操作,该函数的语法如下。
void closedir($dh);
该函数用于关闭由函数opendir()打开的目录句柄$dh,没有返回值。这两个函数的应用演示将在下小节举例。
8.1.2 获取目录中下一个文件的文件名
使用函数readdir()可以获取目录中下一个文件的文件名。该函数的语法如下。
string readdir($dh);
参数$dh是由函数opendir()打开的目录句柄,该函数返回这个句柄所指目录中的文件名,如果失败,返回FALSE。代码8-1演示了该函数的用法,同时也演示了如何使用opendir()打开目录和如何使用colsedir()关闭目录。
代码8-1 使用函数opendir()、readdir()和closedir()处理目录8-1.php
01 <?php
02 $dir = "D:\files";
03
04 if($dh = opendir($dir)) //
打开目录$dir
,并将目录句柄赋给变量$dh
05 {
06 while(($file_name = readdir($dh)) !== FALSE)
//
通过while
循环,使用函数readdir()
获取文件名
07 {
08 echo "file name: ".$file_name;
09 echo "<br/>";
10 echo "<br/>";
11 }
12
13 closedir($dh); //
处理完成后,关闭目录句柄$dh
14 }
15 ?>
【代码解析】代码第04行打开指定的目录,第13行不要忘记关闭打开的目录。第06~11行通过一个while语句。循环输出了指定目录中的文件。假如目录“D:\files”下的内容如图8-1所示,那么代码8-1的执行结果如图8-2所示。

图8-1 目录结构示意图

图8-2 使用readdir()获取目录中的文件名
8.1.3 列出某一目录下的所有文件
除了使用函数readdir()可以获取目录下的文件名之外,函数scandir()也可以列出指定目录中的文件和目录,该函数是PHP5新增的函数。它的语法如下。
array scandir(string $directory);
参数$directory是指定的目录,函数返回值是一个含有文件名的数组,如果失败,函数返回FALSE。如果参数$directory不是一个目录,函数也会返回FALSE。该函数还有一个常用的可选参数作为第2个参数,用来为文件名做排序。代码8-2演示了该函数的用法。
代码8-2 使用函数scandir()列出目录下所有文件8-2.php
01 <?php
02 $dir = "D:\files"; //
指定路径
03
04 $file_list1 = scandir($dir);
05 //
向函数scandir
传入第2
个参数,如果第2
个参数为1
,表示按字母降序排列文件名
06 $file_list2 = scandir($dir,1);
07
08 echo "<pre>"; //
格式化输出
09 print_r($file_list1);
10 print_r($file_list2);
11 ?>
【代码解析】这段代码的执行结果如图8-3所示。从程序的执行结果可以看出,目录“D:\files”下所有文件(含目录)的名称都被存放在数组中,这些文件名可以按不同的排序方式列出,第06行代码表示降序排列。
8.1.4 获取和改变PHP的当前工作目录
PHP提供了以下两个函数,分别完成获取和更改PHP当前工作目录的功能。
·getcwd():返回当前工作目录,如果失败返回FALSE。该函数不需要传入参数。
·chdir():改变PHP的当前工作目录,处理成功该函数返回TRUE,否则返回FALSE。
代码8-3演示了这两个函数的用法。
代码8-3 获取和改变PHP的工作目录8-3.php
01 <?php
02 echo "PHP
当前的工作目录:";
03
04 echo "<br/>";
05 echo getcwd(); //
返回当前目录
06 echo "<br/>";
07
08 chdir("dir_test"); //
改变工作目录至当前目录的dir_test
目录下
09
10 echo "<br/>";
11 echo "
改变工作目录后,工作目录变为:";
12 echo "<br/>";
13
14 echo getcwd(); //
返回当前目录
15 ?>
【代码解析】代码第05行首先输出当前操作的目录,第08行更改当前目录,然后再用第14行输出改变后的当前目录。这段代码的执行结果如图8-4所示。

图8-3 使用scandir()列出目录下所有文件

图8-4 获取和改变PHP当前的工作目录
8.1.5 从目录句柄中读取条目
使用readdir()函数可以从目录句柄中读取下一个文件的文件名,配合while循环可以实现对目录的遍历,代码如下。
<?php
$dir = "html";
$handle = opendir($dir);
if ($handle != false) {
echo "
本目录包含:<br>";
/*
这是正确的遍历目录方法 */
while(false !== ($file = readdir($handle))){
echo $file.
’<br>
’;
}
closedir($handle);
}else{
echo "
打开目录错误!";
}
?>
使用readdir()函数时,要注意以下问题。
·本例中的chdir()将当前目录更改为“html”。
·成功返回TRUE,失败将返回FALSE。
·上例展示的是一个正确的遍历目录的方式,它包括句柄的获取,读取目录和文件的错误控制(体现在while后边的括号内)及关闭句柄。正确遍历目录的方式,三个条件缺一不可。
8.1.6 关闭目录句柄
在使用完opendir()打开的目录句柄后,应使用closedir()进行关闭,以节省服务器资源,代码如下。
<?php
$dir = "html";
//
检查$dir
是否为目录
if(is_dir($dir)){
if($dir_handle = opendir($dir)){
$directory = readdir($dir_handle);
closedir($dir_handle);
}
}
?>
在使用closedir()关闭目录句柄前,应该确认这个句柄是有效的目录句柄,本小节的代码就是一个很好的例子。
上一篇:第8章用PHP操作目录和文件
下一篇:8.2常见的文件操作
