Как использовать PHP для проверки того, что каталог пуст?

Для чтения каталога я использую следующий скрипт. Если в каталоге нет файла, он должен быть пустым. Проблема в том, что он просто говорит, что каталог пуст, хотя есть файлы ARE внутри и наоборот.

<?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 

выражение уже возвращает Empty или Non Empty в терминах языка программирования, FALSE или TRUE соответственно – так что вы можете использовать сам результат в структурах управления, таких как IF() без каких-либо промежуточных значений

Я думаю, что использование FilesystemIterator должно быть самым быстрым и простым способом:

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

Или используя доступ к члену класса при создании экземпляра:

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

Это работает, потому что новая файловая система сначала укажет на первый файл в папке – если в папке нет файлов, valid() вернет false . (см. документацию здесь .)

Как указано abdulmanov.ilmir, дополнительно проверьте, существует ли каталог перед использованием FileSystemIterator потому что иначе он выкинет исключение UnexpectedValueException .

Я нашел быстрое решение

 <?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") 

Это очень старая нить, но я думал, что дам десять центов. Другие решения не помогли мне.

Вот мое решение:

 function is_dir_empty($dir) { foreach (new DirectoryIterator($dir) as $fileInfo) { if($fileInfo->isDot()) continue; return false; } return true; } 

Короткие и сладкие. Работает как шарм.

Для объектно-ориентированного подхода с использованием RecursiveDirectoryIterator из стандартной библиотеки PHP (SPL) .

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

Не нужно создавать экземпляр вашего FileHelper всякий раз, когда вам это нужно, вы можете получить доступ к этому статическому методу везде, где вам это нужно:

 FileHelper::isEmpty($dir); 

Класс FileHelper может быть расширен другими полезными методами для копирования, удаления, переименования и т. Д.

Нет необходимости проверять правильность каталога внутри метода, потому что, если он недопустим, конструктор объекта RecursiveDirectoryIterator будет RecursiveDirectoryIterator исключение UnexpectedValueException , которое достаточно 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 (« строка »Count $ all_files.

  public function does_folder_contain_file_type( $path, $extension ){ $all_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) ); return count( $all_files ); } 

В последнее время у меня была аналогичная проблема, хотя самый высокий ответ на голосование действительно не работал для меня, поэтому мне пришлось придумать аналогичное решение. и снова это также не может быть самым эффективным способом решения проблемы,

Я создал такую ​​функцию

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