filesize() 是判断文件是否为空最直接可靠的方法,返回0即为空文件,但需前置校验 file_exists() 和 is_readable();逻辑空则需 file_get_contents() + trim() 判断。

用 filesize() 判断文件是否为空最直接
空文件即内容长度为 0 字节,filesize() 返回 0 就是可靠依据。它不读取内容,只查文件系统元数据,速度快、开销小。
注意:该函数在文件不存在或权限不足时返回 false,必须先用 file_exists() 和 is_readable() 做前置校验,否则会触发警告。
-
filesize()对符号链接默认返回目标文件大小;如需链接自身大小,加@抑制警告并配合lstat() - Windows 下 NTFS 卷上的稀疏文件可能有非零大小但实际无数据,但这种情况极少见,一般业务无需特殊处理
- 若文件刚被
fopen(..., 'w')创建但未写入,filesize()仍返回0,行为一致
用 file_get_contents() + trim() 检查“逻辑空”更实用
有些文件虽然有字节(比如只含空格、换行、BOM),但业务上视为“空”。这时不能只看 filesize(),得读内容再清理判断。
典型场景:用户上传的 CSV、TXT 或配置文件,可能带 UTF-8 BOM 或全空白行。
立即学习“PHP免费学习笔记(深入)”;
- 先用
file_get_contents($path)读取,再用trim($content) === ''判断——trim()默认清除所有常见空白字符(包括\r\n\t\x00\x0B) - 如果文件可能超大(>2MB),避免用
file_get_contents(),改用fopen()+fgets()逐行检查前几行是否全空白 - UTF-8 BOM(
\xEF\xBB\xBF)会被trim()忽略,无需额外剥离
stat() 的 size 字段和 filesize() 效果一样
stat($path)['size'] 和 filesize($path) 底层调用相同系统接口,返回值完全一致。区别仅在于:stat() 还能顺便拿到修改时间、权限等信息。
如果你 already 在用 stat() 查其他属性,顺手取 ['size'] 更高效;否则没必要为单个 size 多一次系统调用。
-
stat()在文件不存在时也返回false,同样需要前置校验 - 某些 NFS 或网络文件系统下,
stat()可能有缓存延迟,但filesize()同样受影响,无本质差异
容易被忽略的边界情况:文件存在但不可读,或被其他进程独占锁定
file_exists() 返回 true 并不代表你能读它;is_readable() 在 Windows 上对只读文件返回 true,但在 Linux 下受 umask 和 ACL 影响可能失败。
更隐蔽的是:Windows 下某进程以 CREATE_ALWAYS 打开文件后未关闭,会导致 PHP 的 filesize() 和 file_get_contents() 都失败(报错 Permission denied)。
- 统一做法:始终组合使用
file_exists()→is_readable()→ 再调用filesize()或file_get_contents() - 错误处理建议捕获
E_WARNING,或用@抑制后检查返回值是否为false - 生产环境别依赖
getimagesize()或exif_read_data()等图像函数来判断空文件——它们对空文件会直接报错甚至崩溃











