PHP:检查目录是否为空的最快方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (80)

在堆栈溢出,有几个问题的答案,如何检查目录是否为空,但哪一个是最快的,哪一种方式是最有效的?

function dir_is_empty($dir) {
  $handle = opendir($handle);
  while (false !== ($entry = readdir($handle))) {
    if ($entry != "." && $entry != "..") {
      closedir($handle); // <= I added this
      return FALSE;
    }
  }

  closedir($handle); // <= I added this
  return TRUE;
}
$isDirEmpty = !(new \FilesystemIterator($dir))->valid();
$dir = 'directory'; // dir path assign here
echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';

或者,有一种完全不同的方式,哪种方式比上面这三种方法更快、更有效?

至于答案1,请注意我补充了closedir($handle);,但我不确定这是否必要(?)

编辑:一开始我增加了closedir($dir);而不是closedir($handle);

提问于
用户回答回答于

opendir()/readdir()FilesystemIterator两种方法在概念上是等价的,并且执行相同的系统调用(如在Linux下运行的PHP7.2所测试的那样)。

使用的方法glob()会表现得更糟。glob()返回目录中所有文件名的数组;构造该数组可能需要一些时间。如果目录中有许多文件,它将执行更糟糕的是,它必须遍历目录的整个内容。

使用glob()也会在一些情况下给出不正确的结果:

  • 如果$dir是一个目录名,它包含某些特殊字符,包括*?,和[/]
  • 如果$dir只包含dotfile(即以.)

至于答案1,请注意我补充了closedir($dir);,但我不确定这是否必要(?)

这是个好主意,但你没有正确地实现它。需要关闭的目录句柄是$handle,不是$dir

扫码关注云+社区

领取腾讯云代金券