<?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。. 和 ..,否則無限遞歸導致棧溢出。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 迭代器族。