PHP 目录
在本教程中,我们将学习如何使用各种PHP函数来处理目录。
PHP目录操作
PHP提供了一组方便的函数使得可以像处理文件一样处理目录。
通过一个目录句柄操作一个目录,该句柄是一个指向目录的特殊变量。
要获得目录句柄,需要将目录路径传递给opendir()函数,如下所示:
<?php $dh = opendir('./backup');
如果打开目录时出错,opendir()函数将返回false。目录处理完成后,记得使用closedir()函数关闭目录句柄:
<?php closedir($dh);
每个目录可能包含一列文件或子目录,每一条记录称为entry。
其中点号.
表示当前目录
两个点..
表示父目录。
要获取目录中的下一个entry(文件或目录),需要将目录句柄传递给readdir()函数。
下面的示例向您展示了如何列出备份目录中的所有文件:
<?php $dh = opendir('./backup'); if($dh){ echo '<ul>'; while($e = readdir($dh)){ if($e != '.' && $e != '..'){ // 排除当前目录和父目录 echo '<li>' . $e . '</li>'; } } echo '</ul>'; } closedir($dh);
PHP当前目录
默认的当前目录是正在运行的脚本文件的目录。当前目录很重要,因为它被用作相对文件路径的比对目录。
可以使用getcwd()函数获得当前目录。
<?php echo getcwd();
要将当前目录更改为新目录,可以使用chdir()函数:
<?php chdir('./backup'); echo getcwd();
调用chdir()函数后,当前目录将更改为新目录。我们可以通过调用getcwd()函数来验证它。
PHP创建目录
要创建目录,可以使用mkdir()函数。
只需将要创建的目录的路径传递给mkdir()函数。
如果mkdir()函数成功创建了目录,则返回true,否则返回false。
<?php $dir = './theitroad/2017'; $r = mkdir($dir); if($r){ echo sprintf("%s 目录创建成功。",$dir); }else{ echo sprintf(" 创建目录 %s 时出错",$dir); }
请注意,创建目录时,父目录必须存在。
默认情况下,mkdir()函数为新目录设置的权限为0777。如果希望设置不同的权限,可以将其传递给mkdir()函数或使用chmod()函数。
<?php $dir = './theitroad/2017'; mkdir($dir,0644);
PHP删除目录
要删除目录,可以使用rmdir()函数。必须具有足够的权限才能删除目录。此外,目录必须为空,就是说它不包含任何文件或子目录。
以下示例将删除/bak/2016目录:
<?php rmdir('./bak/2016');
PHP从文件路径获取目录路径
要从文件路径获取目录路径,可以使用dirname()函数,如下所示:
<?php echo dirname('./bak/test.txt'); // ./bak
PHP测试文件或目录
PHP把目录和文件都当作文件进行处理。但是目录是一种特殊的文件。要测试一个文件是一个普通的文件还是目录,可以使用一对方便的函数:
- is_dir()——如果文件路径指向某个目录,则返回true。
- is_file()——如果文件路径指向一个文件,则返回true。
让我们看下面的例子:
<?php $path = './backup'; if(is_dir($path)){ echo sprintf('%s 是一个目录',$path); }else if(is_file($path)){ echo sprintf('%s 是一个文件',$path); }else{ echo sprintf('%s 既不是文件也不是目录',$path); }
PHP列出目录中的文件
下面的示例演示如何递归地列出目录及其子目录中的所有文件。
脚本流程如下:
- 读取目录
- 如果条目entry是目录,则将其添加到子目录数组($dirs)中。如果是常规文件,请将其添加到文件数组(files)。
- 显示目录及其文件。
- 对于$dirs数组中的每个子目录,调用函数递归遍历它。
<?php $path = './bak'; traverse_dir($path); function display_files($dir, $files) { echo sprintf("<h2>%s</h2>", $dir); if (count($files) > 0) { echo '<ul>'; foreach ($files as $file) { echo sprintf("<li>%s</li>", $file); } echo '</ul>'; } } function traverse_dir($path) { $dh = opendir($path); $files = array(); $dirs = array(); while ($e = readdir($dh)) { if ($e != '.' && $e != '..') { // 检查它是否是一个目录 $f = $path . '/' . $e; if (is_dir($f)) { $dirs[] = $f; } else if (is_file($f)) { $files[] = $f; } } } closedir($dh); // 显示当前目录及其中的文件 display_files($path, $files); // 递归遍历子目录 foreach ($dirs as $dir) { traverse_dir($dir); } }