判断目录是否为空应使用count(array_diff(scandir($dir), ['.', '..'])) === 0,但须先校验is_dir($dir)和is_readable($dir),因scandir()对非法路径返回false会导致误判;filesize()和stat()['size']不可用。

PHP 怎么判断一个目录是否为空
直接用 scandir() 获取目录内容,再过滤掉 . 和 .. 两个特殊项,剩下的为空就说明是空目录。这是最常用、兼容性最好(PHP 4.0+)的方法。
-
scandir()返回包含所有文件/子目录的数组,包括.(当前目录)和..(父目录),必须显式排除 - 不要用
count(glob($dir . '/*')) === 0,glob()不匹配隐藏文件(如.gitignore),会误判 - 避免用
readdir()手动循环——容易漏掉第一次readdir()返回的.,逻辑易错
一行安全判断空目录的写法
推荐封装成简洁可复用的表达式:
count(array_diff(scandir($dir), ['.', '..'])) === 0
这个表达式能准确反映「除 . 和 .. 外无任何条目」。注意:$dir 必须是真实存在的目录路径,且 PHP 进程有读取权限;否则 scandir() 会触发警告并返回 false,导致 count(false) === 1 误判为非空。
- 务必先用
is_dir($dir)和is_readable($dir)做前置校验 - Windows 下路径分隔符不影响,
scandir()自动适配 - 不依赖扩展,无需开启
fileinfo或其他模块
为什么不能用 filesize() 或 stat() 判断空目录
filesize() 对目录始终返回 false(PHP 8.0+ 报 ValueError),而 stat() 的 size 字段在不同系统上含义不一致:Linux 下是目录数据块大小(通常 4096),与是否为空无关;Windows 下该字段无定义。所以这两者完全不能用于空目录检测。
立即学习“PHP免费学习笔记(深入)”;
- 试图对目录调用
filesize($dir)会触发Warning: filesize(): stat failed for ... -
stat($dir)['size']在 ext4 上恒为 4096,哪怕刚mkdir出来也一样 - 别被某些过时博客误导——这类方法早已被证实不可靠
遇到符号链接时要特别小心
如果 $dir 是指向目录的符号链接,scandir() 默认会解析它(即操作目标目录),但前提是链接本身可读。若链接损坏或目标不可达,scandir() 仍会失败。需要明确业务是否允许跟随链接:
- 想严格检测「该路径字面量是否为空目录」:先用
is_link($dir)拦截,按需处理 - 想检测「链接指向的位置是否为空」:保持原逻辑,但增加对
readlink()+is_dir()的双重检查 - 忽略链接状态直接
scandir()可能掩盖权限或路径问题,错误信息也不够具体
is_dir() 再 is_readable() 最后 scandir(),少一步都可能让 false 被当成有效结果参与 count() 计算。











