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()关闭目录句柄前,应该确认这个句柄是有效的目录句柄,本小节的代码就是一个很好的例子。