PHP Directory 函数

Directory 函数允许您获得关于目录及其内容的信息,包括遍历目录、获取当前目录等操作。

PHP Directory 简介

Directory 函数允许您获得关于目录及其内容的信息。这些函数提供了操作文件系统目录的能力,包括:

  • 打开和关闭目录
  • 读取目录内容
  • 改变当前工作目录
  • 获取目录信息

安装说明

PHP Directory 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。

目录操作的基本概念

重要概念
  • 当前工作目录:脚本执行时的默认目录
  • 目录句柄:打开目录时返回的资源标识符
  • 相对路径和绝对路径:相对于当前目录或从根目录开始的完整路径

PHP Directory 函数列表

函数 描述 版本
chdir() 改变当前的目录。 PHP 4+
chroot() 改变根目录。 PHP 4+
closedir() 关闭目录句柄。 PHP 4+
dir() 返回 Directory 类的实例。 PHP 4+
getcwd() 返回当前工作目录。 PHP 4+
opendir() 打开目录句柄。 PHP 4+
readdir() 返回目录句柄中的条目。 PHP 4+
rewinddir() 重置目录句柄。 PHP 4+
scandir() 返回指定目录中的文件和目录的数组。 PHP 5+
dirname() 返回路径中的目录部分。 PHP 4+
basename() 返回路径中的文件名部分。 PHP 4+
pathinfo() 返回文件路径的信息。 PHP 4+
is_dir() 判断文件名是否是一个目录。 PHP 4+
mkdir() 新建目录。 PHP 4+
rmdir() 删除目录。 PHP 4+

使用示例

基本目录操作
// 获取当前工作目录
$current_dir = getcwd();
echo "当前目录: " . $current_dir . "\n";

// 改变目录
chdir('../');
echo "新目录: " . getcwd() . "\n";

// 返回原目录
chdir($current_dir);
遍历目录(使用 opendir/readdir)
// 打开目录
$dir = opendir('.');

// 读取目录内容
echo "目录内容:\n";
while (($file = readdir($dir)) !== false) {
    if ($file != "." && $file != "..") {
        echo $file . "\n";
    }
}

// 重置目录指针
rewinddir($dir);

// 再次读取
echo "\n重置后重新读取:\n";
while (($file = readdir($dir)) !== false) {
    if ($file != "." && $file != "..") {
        echo $file . "\n";
    }
}

// 关闭目录
closedir($dir);
使用 scandir() 读取目录
// 获取目录中的所有文件和目录
$files = scandir('.');
echo "目录中的文件和目录:\n";
foreach ($files as $file) {
    if ($file != "." && $file != "..") {
        if (is_dir($file)) {
            echo "[目录] " . $file . "\n";
        } else {
            echo "[文件] " . $file . "\n";
        }
    }
}

// 按修改时间排序
$files = scandir('.', SCANDIR_SORT_DESCENDING);
echo "\n按时间降序排序:\n";
print_r($files);
使用 Directory 类
// 创建 Directory 对象
$d = dir('.');

echo "目录句柄: " . $d->handle . "\n";
echo "目录路径: " . $d->path . "\n";

// 读取目录
echo "\n目录内容:\n";
while (false !== ($entry = $d->read())) {
    if ($entry != "." && $entry != "..") {
        echo $entry . "\n";
    }
}

// 关闭目录
$d->close();

高级目录操作示例

递归遍历目录
function listDirectory($path, $level = 0) {
    if (!is_dir($path)) {
        return;
    }

    $items = scandir($path);
    foreach ($items as $item) {
        if ($item == '.' || $item == '..') {
            continue;
        }

        $fullPath = $path . DIRECTORY_SEPARATOR . $item;
        $indent = str_repeat('  ', $level);

        if (is_dir($fullPath)) {
            echo $indent . "[目录] " . $item . "\n";
            listDirectory($fullPath, $level + 1);
        } else {
            echo $indent . "[文件] " . $item . "\n";
        }
    }
}

// 使用示例
echo "递归遍历当前目录:\n";
listDirectory('.');
最佳实践
  • 始终检查目录操作是否成功(如 opendir() 返回 false 表示失败)
  • 使用 is_dir() 检查路径是否为目录
  • 使用 scandir() 比 opendir()/readdir() 组合更方便
  • 注意处理特殊目录 "." 和 ".."
  • 对于大型目录,考虑使用迭代器(如 DirectoryIterator)提高性能
  • 使用绝对路径避免路径相关的问题
  • 确保有适当的文件权限来读取目录
安全注意事项
  • 不要信任用户提供的目录路径,需要验证和过滤
  • 使用 realpath() 解析路径,防止目录遍历攻击
  • 设置适当的文件权限,避免敏感信息泄露
  • chroot() 函数需要 root 权限,使用时要特别小心