使用 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),避免檔案描述符洩漏。opendir 回傳值,目錄不存在或無權限時給予提示;RecursiveDirectoryIterator + RecursiveIteratorIterator(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 專案的推薦做法。