
本文详解PHP中使用filesize()函数获取目录内文件大小的常见错误及正确实现方法,重点解决因路径拼接缺失导致的“stat failed”警告问题。
本文详解php中使用`filesize()`函数获取目录内文件大小的常见错误及正确实现方法,重点解决因路径拼接缺失导致的“stat failed”警告问题。
在PHP中遍历目录并获取每个文件的大小,是一个高频需求。但初学者常犯一个关键错误:scandir()返回的是相对文件名列表(如 report.pdf、image.jpg),而非完整路径;而filesize()函数要求传入绝对路径或相对于当前工作目录的有效路径。若直接传入文件名(如filesize($value)),PHP会尝试在当前脚本所在目录下查找该文件,而非目标目录,从而触发 Warning: filesize(): stat failed for ... 错误。
✅ 正确做法是:将目录路径 $dir 与文件名 $value 拼接成完整路径后再调用 filesize():
<?php
$root = $_SERVER['DOCUMENT_ROOT'];
$dir = $root . '/mphp/124/upload/uploads/';
// 排除特殊目录项(注意:scandir()返回包含 '.' 和 '..',需过滤)
$files = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['.', '..', '.htaccess']);
foreach ($files as $filename) {
$filepath = $dir . $filename; // ✅ 关键:拼接完整路径
// 建议增加文件存在性与类型校验,避免对子目录调用filesize()
if (is_file($filepath)) {
$size = filesize($filepath);
echo htmlspecialchars($filename) . ' → ' . number_format($size) . ' bytes<br>';
}
}
?>? 重要注意事项:
-
scandir($dir, 2)中的2是过时写法(对应SCANDIR_SORT_DESCENDING),推荐显式使用常量SCANDIR_SORT_DESCENDING或SCANDIR_SORT_ASCENDING提高可读性; - 务必用
is_file($filepath)判断是否为普通文件,否则对子目录调用filesize()仍会报错; - 使用
htmlspecialchars()输出文件名,防止XSS风险(尤其当文件名含HTML字符时); - 若需处理大文件(>2GB),注意PHP 32位环境下的
filesize()返回值可能溢出,建议结合SplFileInfo::getSize()或流式检测。
? 进阶提示: 如需按大小排序、筛选特定扩展名或统计总容量,可进一步封装为函数:
立即学习“PHP免费学习笔记(深入)”;
function getDirectoryFileSizes(string $path): array {
if (!is_dir($path)) return [];
$files = array_filter(scandir($path), fn($f) => is_file($path . '/' . $f));
$sizes = [];
foreach ($files as $file) {
$full = $path . '/' . $file;
$sizes[$file] = filesize($full);
}
arsort($sizes); // 按大小降序排列
return $sizes;
}掌握路径拼接与类型校验,即可稳健、安全地获取任意目录下所有文件的大小信息。



















