PHP如何判断文件是否空内容_PHP空文件检测法【状态】

5次阅读

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

PHP如何判断文件是否空内容_PHP空文件检测法【状态】

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() 默认清除所有常见空白字符(包括 rntx00x0B
  • 如果文件可能超大(>2MB),避免用 file_get_contents(),改用 fopen() + fgets() 逐行检查前几行是否全空白
  • UTF-8 BOM(xEFxBBxBF)会被 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 打开文件后未关闭,会导致 phpfilesize()file_get_contents() 都失败(报错 Permission denied)。

  • 统一做法:始终组合使用 file_exists()is_readable() → 再调用 filesize()file_get_contents()
  • 错误处理建议捕获 E_WARNING,或用 @ 抑制后检查返回值是否为 false
  • 生产环境别依赖 getimagesize()exif_read_data() 等图像函数来判断空文件——它们对空文件会直接报错甚至崩溃
text=ZqhQzanResources