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);
}
}

