首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 目錄遞歸遍歷兩大經典方法:glob() 與 DirectoryIterator 實作對比

     編輯:PHP 相關知識

PHP 目錄遞歸遍歷方法總結

方法一:glob() + 遞歸函式

利用 glob() 取得路徑匹配的檔案列表,搭配 is_dir() 判斷並遞歸:

<?php
function myscandir($pathname) {
    foreach (glob($pathname) as $filename) {
        if (is_dir($filename)) {
            myscandir($filename . '/*');
        } else {
            echo $filename . '<br/>';
        }
    }
}
myscandir('D:/wamp/www/exe1/*');
?>

特點:

  • 語法簡潔,支援萬用字元模式匹配
  • 一次回傳陣列,記憶體佔用隨檔案數增長
  • 不包含 . 和 ..,無需額外過濾

方法二:DirectoryIterator 物件導向遍歷

使用內建 DirectoryIterator 類別(或 dir() 函式)逐項讀取:

<?php
function myscandir($path) {
    $mydir = dir($path);
    while ($file = $mydir->read()) {
        $p = $path . '/' . $file;
        if ($file !== "." && $file !== "..") {
            echo $p . '<br>';
        }
        if (is_dir($p) && $file !== "." && $file !== "..") {
            myscandir($p);
        }
    }
}
myscandir(dirname(dirname(__FILE__)));
?>

特點:

  • 逐項讀取,記憶體效率高,適合大量檔案目錄
  • 需手動過濾 . 和 ..
  • 物件導向風格,可擴充性強(如 FilesystemIterator、RecursiveDirectoryIterator)

現代最佳實踐:RecursiveDirectoryIterator

PHP 5.3+ 推薦使用 SPL 迭代器,一行代碼實現遞歸遍歷:

<?php
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/dir', RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
    echo $file->getPathname() . '<br/>';
}
?>

效能與選擇建議

場景推薦方法理由
小型目錄、簡單腳本glob()代碼最少,可讀性高
大量檔案、記憶體敏感DirectoryIterator流式讀取,常數記憶體
需檔案屬性、權限、類型判斷SplFileInfo / RecursiveDirectoryIterator豐富的檔案資訊 API
需過濾特定副檔名RegexIterator 包裝靈活的正則過濾

常見陷阱提醒

  • 符號連結循環:遞歸時需檢測 is_link() 避免無限循環
  • 權限不足:is_readable() 預檢或 try-catch 處理
  • 路徑分隔符:使用 DIRECTORY_SEPARATOR 常數確保跨平台相容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved