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

PHP 遞迴遍歷目錄並計算資料夾總大小的實作程式碼

     編輯:PHP 綜合知識

使用 PHP 內建的目錄操作函數(opendir、readdir、is_dir、filesize)配合遞迴,可輕鬆實現目錄樹遍歷與大小統計。本文提供兩個函數:列印目錄結構與計算總位元組數。

程式碼實作

<?php
$dirname = "test1";

// 遍歷並列印目錄結構
function listdir($dirname) {
    $ds = opendir($dirname);
    while ($file = readdir($ds)) {
        $path = $dirname . '/' . $file;
        if (is_dir($path)) { // 注意:需用完整路徑判斷
            echo "DIR: " . $file . "<br>";
            if ($file != "." && $file != "..") {
                listdir($path); // 遞迴傳入完整路徑
            }
        } else {
            echo "FILE: " . $file . " <br>";
        }
    }
    closedir($ds);
}

// 計算目錄總大小(位元組)
function totdir($dirname) {
    static $tot = 0; // 靜態變數累加
    $ds = opendir($dirname);
    while ($file = readdir($ds)) {
        $path = $dirname . '/' . $file;
        if (is_dir($path)) {
            if ($file != "." && $file != "..") {
                $tot += totdir($path); // 遞迴累加子目錄大小
            }
        } else {
            $tot += filesize($path); // 累加檔案大小
        }
    }
    closedir($ds);
    return $tot;
}

// 執行
listdir($dirname);
echo totdir($dirname) . " bytes";
?>

關鍵點解析

  • 完整路徑判斷:is_dir($file) 僅對相對路徑有效,遞迴時必須使用 $path = $dirname . '/' . $file 完整路徑,否則子目錄判斷失敗;
  • 跳過 . 與 ..:避免無限遞迴;
  • 靜態變數累加:static $tot 在遞迴呼叫間保持狀態,回傳最終總和;
  • 資源釋放:每次 opendir 後配對 closedir($ds),避免檔案描述符洩漏。

改進建議

  1. 錯誤處理:檢查 opendir 回傳值,目錄不存在或無權限時給予提示;
  2. 單位轉換:將位元組轉為 KB、MB、GB 易讀格式;
  3. 效能優化:大量檔案時可考慮 RecursiveDirectoryIterator + RecursiveIteratorIterator(SPL 迭代器)替代手寫遞迴;
  4. 快取結果:若頻繁查詢同目錄,可將結果快取至檔案或 Redis。

SPL 現代寫法參考

function getDirSize($path) {
    $size = 0;
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            $size += $file->getSize();
        }
    }
    return $size;
}

SPL 寫法更簡潔、健壯,支援大檔案、權限錯誤自動跳過,是現代 PHP 專案的推薦做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved