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

PHP 遞歸遍歷目錄並計算總大小(含靜態變量優化)

     編輯:PHP 相關知識

核心代碼

<?php
$dirname = "test1";

/** 遍歷輸出目錄結構 */
function listdir($dirname) {
    $ds = opendir($dirname);
    while (($file = readdir($ds)) !== false) {
        if ($file === '.' || $file === '..') continue;
        $path = $dirname . '/' . $file;
        if (is_dir($path)) {
            echo "DIR: $file<br>";
            listdir($path); // 遞歸
        } else {
            echo "FILE: $file <br>";
        }
    }
    closedir($ds);
}

/** 計算目錄總大小(位元組) */
function totdir($dirname) {
    static $tot = 0; // 靜態變量累加,避免全局變量
    $ds = opendir($dirname);
    while (($file = readdir($ds)) !== false) {
        if ($file === '.' || $file === '..') continue;
        $path = $dirname . '/' . $file;
        if (is_dir($path)) {
            $tot += totdir($path); // 遞歸累加
        } else {
            $tot += filesize($path);
        }
    }
    closedir($ds);
    return $tot;
}

listdir($dirname);
echo "總大小: " . totdir($dirname) . " bytes";
?>

關鍵技術點解析

  • static $tot = 0:函數級靜態變量,跨遞歸調用保持累加值,比全局變量更封裝。
  • opendir/readdir/closedir:標準目錄流操作,記得關閉句柄。
  • 路徑拼接用 /,Windows/Linux 通用;生產建議用 DIRECTORY_SEPARATOR。
  • 必須過濾 . 和 ..,否則無限遞歸導致棧溢出。

現代化改進建議(PHP 5.3+)

use RecursiveIteratorIterator;
use RecursiveDirectoryIterator;

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

優勢: 內建迭代器、自動處理遞歸、支持過濾器、代碼更簡潔。大型項目推薦使用 SPL 迭代器族。

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