
本文详解如何在PHP中正确获取指定目录下所有文件的大小,重点解决因路径拼接错误导致的 filesize(): stat failed 警告问题,并提供健壮、可复用的代码示例。
本文详解如何在php中正确获取指定目录下所有文件的大小,重点解决因路径拼接错误导致的 `filesize(): stat failed` 警告问题,并提供健壮、可复用的代码示例。
在 PHP 中使用 filesize() 获取文件大小时,必须传入完整的绝对路径或相对于当前工作目录的有效路径。而 scandir() 函数返回的是纯文件名(如 'report.pdf'),不包含目录路径。因此,直接对 $value 调用 filesize($value) 实际是在尝试读取当前脚本所在目录下的同名文件——这几乎总是失败,从而触发 Warning: filesize(): stat failed。
你原始代码中的关键错误在于这一行:
echo $value . ',' . filesize($value) . '<br>';
此处 $value 仅为文件名(如 'image.jpg'),而非完整路径。PHP 尝试在当前执行目录(非 $dir)下查找该文件,自然多数失败。
✅ 正确做法是将目录路径 $dir 与文件名 $value 拼接成完整路径:
<?php $root = $_SERVER['DOCUMENT_ROOT'];
$dir = $root . '/mphp/124/upload/uploads/';
// 排除 .、.. 和 .htaccess,注意:scandir 第二参数 2 表示降序,不影响结果
$files = array_diff(scandir($dir, 2), ['..', '.', '.htaccess']);
foreach ($files as $filename) {
$filepath = $dir . $filename; // ✅ 关键:构造完整路径
// 建议增加文件存在性与类型校验,避免目录被误判为文件
if (is_file($filepath)) {
$size = filesize($filepath);
echo htmlspecialchars($filename) . ' → ' . number_format($size) . ' bytes<br>';
} else {
echo '<span style="color:red;">⚠️ Skipping non-file: ' . htmlspecialchars($filename) . '</span><br>';
}
}
?>
? 重要注意事项:
-
scandir()返回的条目可能包含子目录,filesize()对目录会失败,因此务必用is_file()过滤; - 使用
htmlspecialchars()防止 XSS(尤其当文件名含 HTML 字符时); -
filesize()返回字节数,大文件建议转换为 KB/MB(例如:round($size / 1024, 1) . ' KB'); - 若目录权限不足或路径不存在,
scandir()本身会报错,建议前置检查:if (!is_dir($dir) || !is_readable($dir)) { die('Invalid or unreadable directory'); }。
? 进阶提示: 如需递归统计子目录,推荐使用 RecursiveIteratorIterator + RecursiveDirectoryIterator;若追求性能与简洁,也可改用 glob($dir . '*') 并配合 array_filter($files, 'is_file')。
掌握路径拼接与类型校验,即可稳定、安全地遍历并获取任意目录中所有文件的大小信息。










