【问题标题】:PHP: The fastest way to check if the directory is empty?PHP:检查目录是否为空的最快方法?
【发布时间】:2018-11-14 07:51:59
【问题描述】:

在 Stack Overflow 上,关于如何检查目录是否为空的问题有几个答案,但哪种方法最快,哪种方法最有效?


答案 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 中所述。

【问题讨论】:

  • 谁在乎?可读性更为重要。
  • 你运行基准测试了吗?
  • @arkascha 我在乎。
  • @Jhecht 这在概念上类似于glob() 解决方案,并且在大型目录上也表现不佳。
  • @smith Noooo。启动一个新进程更多更加“昂贵”,而且我想不出任何一个命令可以以非破坏性方式完成这项工作。

标签: php php-7.2


【解决方案1】:

opendir()/readdir()FilesystemIterator 方法在概念上是等效的,并且执行相同的系统调用(在 Linux 下运行的 PHP 7.2 上测试过)。没有任何一个比另一个更快的根本原因,因此如果您需要进行微优化,我建议您运行基准测试。

使用glob() 的方法效果会更差。 glob() 返回目录中所有文件名的数组;构建该数组可能需要一些时间。如果目录中有很多文件,它会执行很多更糟,因为它必须遍历目录的全部内容。

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

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

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

这是个好主意,但您的实施不正确。需要关闭的目录句柄是$handle,而不是$dir

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-10-11
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多