如何使用PHP来检查一个目录是否为空?
我正在使用以下脚本来读取一个目录。 如果目录中没有文件,它应该是空的。 问题是,即使内部存在文件,它仍然说目录是空的,反之亦然。
<?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"; } ?>  看来你需要scandir而不是glob,因为glob不能看到unix隐藏的文件。 
 <?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 != "..") { return FALSE; } } return TRUE; } 
顺便说一下,不要用文字来代替布尔值。 后者的目的是告诉你是否有空。 一个
 a === b 
 expression式已经分别在编程语言, FALSE或TRUE方面返回Empty或Non Empty – 所以,你可以在IF()这样的控制结构中使用没有任何中间值的结果 
我认为使用FilesystemIterator应该是最快最容易的方法:
 // PHP 5 >= 5.3.0 $iterator = new \FilesystemIterator($dir); $isDirEmpty = !$iterator->valid(); 
或者在实例化中使用类成员访问:
 // PHP 5 >= 5.4.0 $isDirEmpty = !(new \FilesystemIterator($dir))->valid(); 
我find了一个快速解决scheme
 <?php $dir = 'directory'; // dir path assign here echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; ?> 
使用
 if ($q == "Empty") 
代替
 if ($q="Empty") 
尝试这个:
 <?php $dirPath = "Add your path here"; $destdir = $dirPath; $handle = opendir($destdir); $c = 0; while ($file = readdir($handle)&& $c<3) { $c++; } if ($c>2) { print "Not empty"; } else { print "Empty"; } ?> 
 可能是因为if语句中的赋值操作符。 
更改:
 if ($q="Empty") 
至:
 if ($q=="Empty") 
这是一个非常古老的线索,但我想我会给我十分钱。 其他解决scheme不适合我。
这是我的解决scheme:
 function is_dir_empty($dir) { foreach (new DirectoryIterator($dir) as $fileInfo) { if($fileInfo->isDot()) continue; return false; } return true; } 
简短而甜蜜。 奇迹般有效。
 对于使用标准PHP库(SPL)中的RecursiveDirectoryIterator面向对象的方法。 
 <?php namespace My\Folder; use RecursiveDirectoryIterator; class FileHelper { /** * @param string $dir * @return bool */ public static function isEmpty($dir) { $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); return iterator_count($di) === 0; } } 
 无需在需要的时候创buildFileHelper的实例,就可以像下面这样访问这个静态方法: 
 FileHelper::isEmpty($dir); 
  FileHelper类可以扩展与其他有用的方法,复制,删除,重命名等 
 没有必要检查方法内的目录的有效性,因为如果它是无效的, RecursiveDirectoryIterator的构造函数将抛出一个UnexpectedValueException ,它充分覆盖了这个部分。 
只要纠正你的代码是这样的:
 <?php $pid = $_GET["prodref"]; $dir = '/assets/'.$pid.'/v'; $q = count(glob("$dir/*")) == 0; if ($q) { echo "the folder is empty"; } else { echo "the folder is NOT empty"; } ?> 
@你的常识
我认为你的高性能的例子可以使用严格的比较更高性能:
 function is_dir_empty($dir) { if (!is_readable($dir)) return null; $handle = opendir($dir); while (false !== ($entry = readdir($handle))) { if ($entry !== '.' && $entry !== '..') { // <-- better use strict comparison here closedir($handle); // <-- always clean up! Close the directory stream return false; } } closedir($handle); // <-- always clean up! Close the directory stream return true; } 
我在我的Wordpress CSV 2 POST插件中使用这种方法。
  public function does_folder_contain_file_type( $path, $extension ){ $all_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) ); $html_files = new RegexIterator( $all_files, '/\.'.$extension.'/' ); foreach( $html_files as $file) { return true;// a file with $extension was found } return false;// no files with our extension found } 
它通过特定的扩展工作,但很容易通过删除“新的RegexIterator(”行,计数$ all_files。
  public function does_folder_contain_file_type( $path, $extension ){ $all_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) ); return count( $all_files ); } 
我最近也有类似的问题,但是最高的答案对我来说并不是真的,所以我不得不提出类似的解决scheme。 而且这也可能不是解决问题的最有效方式,
我创build了这样的function
 function is_empty_dir($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir."/".$object) == "dir") { return false; } else { return false; } } } reset($objects); return true; } 
并用它来检查空的演习如此
 if(is_empty_dir($path)){ rmdir($path); } 
你可以使用这个:
 function isEmptyDir($dir) { return (($files = @scandir($dir)) && count($files) <= 2); }