
本文详解PHP中使用filesize()函数获取目录文件大小时的常见错误及解决方案,重点解决因路径拼接缺失导致的“stat failed”警告问题。
本文详解php中使用`filesize()`函数获取目录文件大小时的常见错误及解决方案,重点解决因路径拼接缺失导致的“stat failed”警告问题。
在PHP中遍历目录并获取每个文件的大小,是文件管理、上传监控或磁盘空间分析中的常见需求。但初学者常遇到类似以下错误:
Warning: filesize(): stat failed for example.txt in /path/to/script.php on line 6
其根本原因在于:scandir() 返回的是纯文件名列表(如 report.pdf、image.jpg),不包含路径信息;而 filesize() 函数需要完整的绝对路径或相对于当前工作目录的有效路径才能定位文件。你代码中直接传入 $value(即文件名),等价于在脚本所在目录下查找该文件,自然多数情况下失败。
✅ 正确做法是将目录路径 $dir 与文件名 $value 拼接,构成完整路径:
<?php
$root = $_SERVER['DOCUMENT_ROOT'];
$dir = $root . '/mphp/124/upload/uploads/';
// 使用 DIRECTORY_SEPARATOR 提升跨平台兼容性(推荐)
$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>';
} else {
echo htmlspecialchars($filename) . ' → (not a file, skipped)<br>';
}
}
?>? 关键改进说明:
立即学习“PHP免费学习笔记(深入)”;
- 使用
$dir . $filename替代孤立的$filename,确保filesize()接收有效路径; - 添加
is_file()判断,防止对目录、符号链接等非文件项调用filesize()(否则仍会报错); - 使用
htmlspecialchars()防止文件名含HTML特殊字符导致页面渲染异常; -
number_format()提升大小数值可读性; - 推荐用
SCANDIR_SORT_DESCENDING替代数字2(更语义化且兼容未来PHP版本); - 如需更高可靠性,可改用
glob($dir . '*')或DirectoryIterator(支持更多元数据和异常处理)。
⚠️ 注意事项:
- 确保 PHP 进程对目标目录及其中文件具有读取权限,否则
filesize()仍会失败; -
filesize()对大于 2GB 的文件在32位系统上可能返回错误值,大文件建议使用fstat()+filesize()组合或流式处理; - 避免在Web环境中直接暴露敏感路径(如
$_SERVER['DOCUMENT_ROOT']),生产环境应配置白名单或使用相对安全路径。
掌握路径拼接与类型校验,即可稳健、安全地实现目录文件尺寸统计——这是构建文件管理系统不可或缺的基础能力。



















