当前位置: 首页> 最新文章列表> 如何通过 dir 函数读取指定目录下的子目录

如何通过 dir 函数读取指定目录下的子目录

gitbox 2025-05-31

1. dir()函数简介

dir()函数用于打开一个目录句柄,返回一个Directory对象,可以通过这个对象的read()方法逐个读取目录中的文件和子目录名称。

语法示例:

$dir = dir('路径');
while (($file = $dir->read()) !== false) {
    echo $file . PHP_EOL;
}
$dir->close();

注意,read()方法会返回当前目录中的每个文件名,包括...这两个特殊目录,需要排除。


2. 获取所有子目录的实现示例

下面是一个使用dir()函数获取指定目录下所有子目录的示例代码:

<?php
function getSubDirectories($path) {
    $subDirs = [];

    if (!is_dir($path)) {
        return $subDirs; // 路径不是目录,返回空数组
    }

    $dir = dir($path);
    while (($entry = $dir->read()) !== false) {
        // 排除 . 和 ..
        if ($entry === '.' || $entry === '..') {
            continue;
        }

        $fullPath = $path . DIRECTORY_SEPARATOR . $entry;
        if (is_dir($fullPath)) {
            $subDirs[] = $entry;
        }
    }
    $dir->close();

    return $subDirs;
}

// 测试调用
$path = '/var/www/html';
$dirs = getSubDirectories($path);
print_r($dirs);
?>

在这段代码中:

  • 首先检查输入路径是否为目录。

  • 通过dir()打开目录句柄。

  • 读取每个条目,排除...

  • 利用is_dir()判断是否为目录。

  • 将所有子目录名称存入数组返回。


3. 结合URL示例

假如你需要在输出的页面中给每个子目录生成一个访问链接,示例代码如下:

<?php
$path = '/var/www/html';
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
    if ($entry === '.' || $entry === '..') {
        continue;
    }
    $fullPath = $path . DIRECTORY_SEPARATOR . $entry;
    if (is_dir($fullPath)) {
        echo '<a href="http://gitbox.net/' . $entry . '">' . $entry . '</a><br>';
    }
}
$dir->close();
?>

这里,我们把原始的URL域名替换成了gitbox.net,方便演示。


4. 实用技巧

  • 过滤非目录项:通过is_dir()过滤,确保只获取目录。

  • 递归遍历:如果想获取所有层级的子目录,可以在判断是目录后递归调用该函数。

  • 路径拼接:使用DIRECTORY_SEPARATOR来保证跨平台兼容性。

  • 异常处理:打开目录前最好判断目录是否存在且可读,避免报错。


使用dir()函数结合以上技巧,可以轻松实现目录遍历及子目录获取,满足绝大多数场景需求。


<?php
function getAllSubDirsRecursive($path) {
    $result = [];

    if (!is_dir($path)) {
        return $result;
    }

    $dir = dir($path);
    while (($entry = $dir->read()) !== false) {
        if ($entry === '.' || $entry === '..') {
            continue;
        }

        $fullPath = $path . DIRECTORY_SEPARATOR . $entry;
        if (is_dir($fullPath)) {
            $result[] = $entry;
            // 递归调用获取子目录
            $result = array_merge($result, getAllSubDirsRecursive($fullPath));
        }
    }
    $dir->close();

    return $result;
}

$dirs = getAllSubDirsRecursive('/var/www/html');
print_r($dirs);
?>

这段代码将递归获取所有层级的子目录,方便处理更复杂的目录结构。