在 PHP 中計算某個目錄(包含所有子目錄和文件)的總大小,最常用的方法是編寫一個遞歸函數。該函數遍歷目錄下的每一項,若為文件則累加其大小,若為子目錄則遞歸調用自身繼續統計。
function dirsize($dir) {
$dh = @opendir($dir);
$size = 0;
while (($file = @readdir($dh)) !== false) {
if ($file !== '.' && $file !== '..') {
$path = $dir . '/' . $file;
if (is_dir($path)) {
$size += dirsize($path);
} elseif (is_file($path)) {
$size += filesize($path);
}
}
}
@closedir($dh);
return $size;
}
調用函數後,返回的單位是字節。通常我們會將其轉換為 MB 或 GB 以便閱讀:
$targetDir = "/var/www/lg";
$totalBytes = dirsize($targetDir);
$totalMB = $totalBytes / 1024 / 1024;
echo "目錄大小: " . round($totalMB, 2) . " MB";
@ 抑制錯誤提示雖然方便,但生產環境建議加入錯誤處理,例如判斷 is_readable()。RecursiveDirectoryIterator 配合 RecursiveIteratorIterator 實現非遞歸遍歷,並配合 set_time_limit(0) 移除執行時間限制。is_dir() 和 is_file() 會自動解析符號鏈接,若需跳過鏈接文件,可額外加入 is_link() 判斷。function getDirectorySize(string $directory): int {
$size = 0;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$size += $file->getSize();
}
}
return $size;
}
此寫法更符合現代 PHP 標準,代碼更簡潔且自帶錯誤異常機制。