代码之家  ›  专栏  ›  技术社区  ›  PeraMika

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

  •  -2
  • PeraMika  · 技术社区  · 6 年前

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


    答案1: https://stackoverflow.com/a/7497848/4437206

    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;
    }
    

    答案2: https://stackoverflow.com/a/18856880/4437206

    $isDirEmpty = !(new \FilesystemIterator($dir))->valid();
    

    答案3: https://stackoverflow.com/a/19243116/4437206

    $dir = 'directory'; // dir path assign here
    echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
    

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

    关于答案1,请注意我添加了 closedir($handle); ,但我不确定是否有必要(?).

    编辑: 最初我添加了 closedir($dir); 而不是 closedir($handle); ,但我更正为 @duskwuff 在他的 answer .

    1 回复  |  直到 6 年前
        1
  •  4
  •   gone    6 年前

    这个 opendir() / readdir() FilesystemIterator 这两种方法在概念上是等价的,并且执行相同的系统调用(在linux下运行的php 7.2上进行了测试)。没有根本的原因可以解释为什么两个都比另一个快,所以如果需要进行微观优化,我建议您运行基准测试。

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

    使用 全局() 在许多情况下也会产生不正确的结果:

    • 如果 $dir 是包含某些特殊字符的目录名,包括 * , ? [ / ]
    • 如果 迪尔 仅包含点文件(即文件名以 . )

    关于答案1,请注意我添加了 closedir($dir); ,但我不确定是否有必要(?).

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