當前位置: 首頁> 最新文章列表> 如何通過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);
?>

這段代碼將遞歸獲取所有層級的子目錄,方便處理更複雜的目錄結構。