Я использую следующий сценарий для чтения каталога. Если в каталоге нет файла, он должен сказать пустой. Проблема в том, что он просто продолжает говорить, что каталог пуст, даже если внутри есть файлы, и наоборот.
<?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 != "..") { closedir($handle); return FALSE; } } closedir($handle); return TRUE; }
Кстати, не используйте слова для замены логических значений. Сама цель последнего - сказать вам, пусто что-то или нет. An
выражение уже возвращает
Empty
илиNon Empty
в терминах языка программирования,FALSE
илиTRUE
соответственно - так что вы можете использовать сам результат в управляющих структурах, например,IF()
без каких-либо промежуточных значенийисточник
$dir = 'testfolder';
вручную. затем запустите этот код. debug распечатывает как можно больше информации, чтобы увидеть, что идет не так.$dir = 'testfolder';var_dump(scan_dir($dir));
скажет вам, что находится в этом каталогеЯ думаю, что использование FilesystemIterator должно быть самым быстрым и простым способом:
// PHP 5 >= 5.3.0 $iterator = new \FilesystemIterator($dir); $isDirEmpty = !$iterator->valid();
Или используя доступ к члену класса при создании экземпляра:
// PHP 5 >= 5.4.0 $isDirEmpty = !(new \FilesystemIterator($dir))->valid();
Это работает, потому что новый
FilesystemIterator
будет изначально указывать на первый файл в папке - если в папке нет файлов,valid()
вернетсяfalse
. (см. документацию здесь .)Как указывает abdulmanov.ilmir, при необходимости проверьте, существует ли каталог перед использованием,
FileSystemIterator
потому что в противном случае он выдаст файлUnexpectedValueException
.источник
$dir
он не существует, будет выдано исключение.Я нашел быстрое решение
<?php $dir = 'directory'; // dir path assign here echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; ?>
источник
использовать
if ($q == "Empty")
вместо
if ($q="Empty")
источник
Для объектно - ориентированного подхода с использованием
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
выдаст объектUnexpectedValueException
, который достаточно покрывает эту часть.источник
Попробуй это:
<?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; }
Коротко и мило. Работает как шарм.
источник
@ Ваш здравый смысл
Я думаю, что ваш эффективный пример мог бы быть более производительным при строгом сравнении:
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; }
источник
return false
дело не в этом ;-)Я использовал:
if(is_readable($dir)&&count(scandir($dir))==2) ... //then the dir is empty
источник
count
Использование функции может быть медленным на большом массиве.isset
все быстрееЭто будет правильно работать на PHP> = 5.4.0 (см. Список изменений здесь )
function dir_is_empty($path){ //$path is realpath or relative path $d = scandir($path, SCANDIR_SORT_NONE ); // get dir, without sorting improve performace (see Comment below). if ($d){ // avoid "count($d)", much faster on big array. // Index 2 means that there is a third element after ".." and "." return !isset($d[2]); } return false; // or throw an error }
В противном случае, используя решение @Your Common Sense, лучше избегать загрузки списка файлов в ОЗУ.
Спасибо и проголосуйте за @soger, чтобы улучшить этот ответ с помощью
SCANDIR_SORT_NONE
опции.источник
Просто исправьте свой код следующим образом:
<?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"; } ?>
источник
Я использую этот метод в своем плагине 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 }
Он работает с определенным расширением, но его легко изменить в соответствии с вашими потребностями, удалив строку «new 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); }
источник
Первый вопрос: когда каталог пуст? В каталоге есть 2 файла с расширением '.' и '..'.
Рядом с этим на Mac может быть файл .DS_Store. Этот файл создается при добавлении какого-либо содержимого в каталог. Если эти 3 файла находятся в каталоге, вы можете сказать, что каталог пуст. Итак, чтобы проверить, пуст ли каталог (без проверки, является ли $ dir каталогом):
function isDirEmpty( $dir ) { $count = 0; foreach (new DirectoryIterator( $dir ) as $fileInfo) { if ( $fileInfo->isDot() || $fileInfo->getBasename() == '.DS_Store' ) { continue; } $count++; } return ($count === 0); }
источник
@ Твой здравый смысл, @ Enyby
Некоторое улучшение вашего кода:
function dir_is_empty($dir) { $handle = opendir($dir); $result = true; while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { $result = false; break 2; } } closedir($handle); return $result; }
Я использую переменную для хранения результата и устанавливаю для нее значение true.
Если каталог пуст, возвращаются только файлы. и .. (на сервере linux вы можете расширить условие для Mac, если вам нужно), поэтому условие истинно.
Затем значение result устанавливается в false, и break 2 выходит из цикла if и while, поэтому следующий выполненный оператор закрывается.
Следовательно, цикл while будет иметь только 3 круга, прежде чем он завершится, независимо от того, пуст каталог или нет.
источник