如何使用PHP检查目录是否为空?

2022-08-30 07:54:32

我正在使用以下脚本来读取目录。如果目录中没有文件,则应显示空。问题是,它只是一直说目录是空的,即使里面有文件,反之亦然。

<?php
$pid = $_GET["prodref"];
$dir = '/assets/'.$pid.'/v';
$q   = (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
    
if ($q=="Empty") 
    echo "the folder is empty"; 
else
    echo "the folder is NOT empty";
?>

答案 1

似乎你需要而不是glob,因为glob看不到unix隐藏文件。scandir

<?php
$pid = basename($_GET["prodref"]); //let's sanitize it a bit
$dir = "/assets/$pid/v";

if (is_dir_empty($dir)) {
  echo "the folder is empty"; 
}else{
  echo "the folder is NOT empty";
}

function is_dir_empty($dir) {
  if (!is_readable($dir)) return null; 
  return (count(scandir($dir)) == 2);
}
?>

请注意,此代码不是效率的顶峰,因为没有必要读取所有文件来判断目录是否为空。因此,更好的版本将是

function dir_is_empty($dir) {
  $handle = opendir($dir);
  while (false !== ($entry = readdir($handle))) {
    if ($entry != "." && $entry != "..") {
      closedir($handle);
      return false;
    }
  }
  closedir($handle);
  return true;
}

顺便说一句,不要使用单词来替换布尔值。后者的目的是告诉你是否有空的东西。一

a === b

表达式已经返回或以编程语言的形式,或分别返回 - 因此,您可以在控制结构中使用非常结果,就像没有任何中间值一样EmptyNon EmptyfalsetrueIF()


答案 2

我认为使用FilesystemIterator应该是最快,最简单的方法:

// PHP 5 >= 5.3.0
$iterator = new \FilesystemIterator($dir);
$isDirEmpty = !$iterator->valid();

或者在实例化时使用类成员访问权限:

// PHP 5 >= 5.4.0
$isDirEmpty = !(new \FilesystemIterator($dir))->valid();

这之所以有效,是因为新文件最初将指向文件夹中的第一个文件 - 如果文件夹中没有文件,则返回 。(请参阅此处的文档。FilesystemIteratorvalid()false

正如abdulmanov.ilmir所指出的,在使用之前,可以选择检查该目录是否存在,否则它将抛出一个.FileSystemIteratorUnexpectedValueException


推荐