PHP 目录

时间:2018-11-15 15:09:41  来源:igfitidea点击:

在本教程中,我们将学习如何使用各种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列出目录中的文件

下面的示例演示如何递归地列出目录及其子目录中的所有文件。

脚本流程如下:

  1. 读取目录
  2. 如果条目entry是目录,则将其添加到子目录数组($dirs)中。如果是常规文件,请将其添加到文件数组(files)。
  3. 显示目录及其文件。
  4. 对于$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);
    }
}