在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。
答案 0 :(得分:4)
opendir()
/ readdir()
和FilesystemIterator
方法在概念上是等效的,并执行相同的系统调用(在Linux下运行的PHP 7.2上测试)。没有任何根本原因可以解释为什么其中一个会比另一个更快,所以如果你需要进行微优化,我建议你运行基准测试。
使用glob()
的方法会更糟糕。 glob()
返回目录中所有文件名的数组;构造该数组可能需要一些时间。如果目录中有许多文件,它将执行更多更糟糕的情况,因为它必须遍历目录的整个内容。
在许多情况下,使用glob()
也会得出错误的结果:
$dir
是包含某些特殊字符的目录名称,包括*
,?
和[
/ ]
$dir
仅包含dotfiles(即文件名以.
开头)关于答案1,请注意我添加了
closedir($dir);
,但我不确定是否有必要(?)。
这是一个好主意,但您已经错误地实施了它。需要关闭的目录句柄是$handle
,而不是$dir
。