判断目录是否为空应使用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 下该字段无定义。所以这两者完全不能用于空目录检测。