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

PHP 遞歸計算目錄總大小

     編輯:PHP 相關知識

PHP 遞歸計算目錄總大小

遞歸掃描目錄下所有檔案(忽略 . 與 ..),累加檔案大小,遇到子目錄則遞歸進入。回傳總位元組數,若目錄無法開啟則回傳 -1。

函式實作

<?php
/**
 * 遞歸計算目錄大小
 * @param string $dirPath 目錄路徑(建議以 DIRECTORY_SEPARATOR 結尾)
 * @return int 總位元組數,失敗回傳 -1
 */
function calcDirectorySize($dirPath) {
    $size = 0;
    $dh = @opendir($dirPath);
    if (!$dh) return -1;

    while (($file = readdir($dh)) !== false) {
        if ($file[0] === '.') continue; // 跳過 . 與 ..
        $full = $dirPath . $file;
        if (is_dir($full)) {
            $sub = calcDirectorySize($full . DIRECTORY_SEPARATOR);
            if ($sub >= 0) $size += $sub;
        } else {
            $size += filesize($full);
        }
    }
    closedir($dh);
    return $size;
}

// 使用範例
$bytes = calcDirectorySize('data/');
echo "目錄大小:$bytes 位元組 (" . round($bytes/1024/1024,2) . " MB)";
?>

注意事項

  • 大量檔案時遞歸深度可能觸發堆疊溢位,可改用 RecursiveDirectoryIterator + RecursiveIteratorIterator 迭代器模式。
  • 符號連結預設不跟隨,若需計算連結目標大小請加入 is_link() 判斷與 readlink() 處理。
  • 權限不足的目錄/檔案會被略過,建議記錄警告日誌。
  • 回傳值為位元組,顯示時可搭配單位轉換函式(如 formatBytes())。

迭代器替代方案(非遞歸、記憶體友善)

<?php
function calcDirSizeIterator($path) {
    $total = 0;
    $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS));
    foreach ($ite as $file) {
        if ($file->isFile()) $total += $file->getSize();
    }
    return $total;
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved