萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 目錄遞歸遍歷:dir() 與 readdir() 兩種方式完整對比

方式一:dir() 面向對象風格

$dir = @dir('upload'); // @ 抑制目錄不存在警告
while (($file = $dir->read()) !== false) {
    echo "文件名: $file
"; } $dir->close();

返回 Directory 實例,提供 read()、rewind()、close()、path 屬性。

遞歸遍歷目錄樹(dir 版)

function treeDir($path) {
    $dir = dir($path);
    while (($file = $dir->read()) !== false) {
        if ($file === '.' || $file === '..') continue;
        $full = $path . DIRECTORY_SEPARATOR . $file;
        if (is_dir($full)) {
            echo "目錄: $full
"; treeDir($full); } else { echo "文件: $full
"; } } $dir->close(); } treeDir('./phpmyadmin');

方式二:opendir() + readdir() 過程風格


function listDir($path) {
    if (!is_dir($path)) { echo "無效目錄"; return; }
    $handle = opendir($path);
    while (($file = readdir($handle)) !== false) {
        if ($file === '.' || $file === '..') continue;
        $full = $path . DIRECTORY_SEPARATOR . $file;
        if (is_dir($full)) {
            echo "目錄: $full
"; listDir($full); } else { echo "文件: $full
"; } } closedir($handle); } listDir('./phpmyadmin');

現代最佳實踐:SPL 迭代器(PHP 5.3+)


// 遞歸遍歷,自動跳過 . 和 ..
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('./phpmyadmin', FilesystemIterator::SKIP_DOTS)
);
foreach ($iterator as $fileInfo) {
    echo $fileInfo->isDir() ? "目錄: " : "文件: ";
    echo $fileInfo->getPathname() . "
"; } // 只獲取 .php 文件 $phpFiles = new RegexIterator( new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')), '/\.php$/i' ); foreach ($phpFiles as $f) echo $f->getPathname() . "
";

對比總結

特性dir()readdir()SPL 迭代器
風格OO過程式OO/函數式
內存效率逐個讀取逐個讀取逐個讀取(生成器特性)
過濾/轉換手動手動RegexIterator, CallbackFilterIterator
深度控制手動遞歸手動遞歸RecursiveIteratorIterator::setMaxDepth()
文件信息需額外 stat需額外 statSplFileInfo 內置 size/mtime/perms
推薦指數★★☆★★☆★★★★★

生產建議

  • 新項目**直接使用 SPL 迭代器**,功能強、可組合、符合現代 PHP 風格。
  • 舊代碼維護中 dir()/readdir() 仍可工作,但注意 === false 嚴格判斷防 0 值誤終止。
  • 大目錄遍歷考慮 exec('find ...') 或異步隊列分批處理,避免阻塞 Web 請求。
copyright © 萬盛學電腦網 all rights reserved