Estoy usando el siguiente script para leer un directorio. Si no hay ningún archivo en el directorio, debería decir vacío. El problema es que sigue diciendo que el directorio está vacío aunque HAY archivos dentro y viceversa.
<?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";
?>
Respuestas:
Parece que necesita en
scandir
lugar de glob, ya que glob no puede ver los archivos ocultos de 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); } ?>
Tenga en cuenta que este código no es la cima de la eficiencia, ya que no es necesario leer todos los archivos solo para saber si el directorio está vacío. Entonces, la mejor versión sería
function dir_is_empty($dir) { $handle = opendir($dir); while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { closedir($handle); return FALSE; } } closedir($handle); return TRUE; }
Por cierto, no use palabras para sustituir valores booleanos . El propósito de este último es decirle si algo está vacío o no. Un
expresión ya devuelve
Empty
oNon Empty
en términos de lenguaje de programación,FALSE
oTRUE
respectivamente, por lo que puede usar el resultado en estructuras de control comoIF()
sin valores intermediosfuente
$dir = 'testfolder';
manualmente. luego ejecute este código. depurar es imprimir tanta información como sea posible para ver qué está mal.$dir = 'testfolder';var_dump(scan_dir($dir));
le dirá lo que hay en este directorioCreo que usar FilesystemIterator debería ser la forma más rápida y sencilla:
// PHP 5 >= 5.3.0 $iterator = new \FilesystemIterator($dir); $isDirEmpty = !$iterator->valid();
O usando el acceso de miembros de la clase en la instanciación:
// PHP 5 >= 5.4.0 $isDirEmpty = !(new \FilesystemIterator($dir))->valid();
Esto funciona porque un nuevo
FilesystemIterator
apuntará inicialmente al primer archivo de la carpeta; si no hay archivos en la carpeta,valid()
volveráfalse
. (ver documentación aquí ).Como lo señaló abdulmanov.ilmir, opcionalmente verifique si el directorio existe antes de usar el
FileSystemIterator
porque de lo contrario arrojará unUnexpectedValueException
.fuente
$dir
no existe, se lanzará una excepción.Encontré una solución rápida
<?php $dir = 'directory'; // dir path assign here echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; ?>
fuente
utilizar
if ($q == "Empty")
en vez de
if ($q="Empty")
fuente
Para un enfoque orientado a objetos utilizando el
RecursiveDirectoryIterator
del PHP biblioteca estándar (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; } }
No es necesario crear una instancia de su
FileHelper
cuando lo necesite, puede acceder a este método estático donde lo necesite de esta manera:los
FileHelper
clase se puede ampliar con otros métodos útiles para copiar, borrar, renombrar, etc.No hay necesidad de verificar la validez del directorio dentro del método porque si no es válido, el constructor
RecursiveDirectoryIterator
arrojará unUnexpectedValueException
que cubra esa parte suficientemente.fuente
Prueba esto:
<?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"; } ?>
fuente
Probablemente debido al operador de asignación en
if
declaración.Cambio:
if ($q="Empty")
A:
if ($q=="Empty")
fuente
Este es un hilo muy antiguo, pero pensé en dar mis diez centavos. Las otras soluciones no funcionaron para mí.
Aquí está mi solución:
function is_dir_empty($dir) { foreach (new DirectoryIterator($dir) as $fileInfo) { if($fileInfo->isDot()) continue; return false; } return true; }
Corto y dulce. Funciona de maravilla.
fuente
@ Tu sentido común
Creo que su ejemplo de rendimiento podría ser más eficaz utilizando una comparación estricta:
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; }
fuente
return false
caso no se está ocupando de él ;-)Solía:
if(is_readable($dir)&&count(scandir($dir))==2) ... //then the dir is empty
fuente
El
count
uso de funciones puede ser lento en una gran variedad.isset
es cada vez más rápidoEsto funcionará correctamente en PHP> = 5.4.0 (consulte el registro de cambios aquí )
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 }
De lo contrario, usar @Your Common Sense es mejor para evitar cargar la lista de archivos en la RAM
Gracias y vote a @soger también, para mejorar esta respuesta usando la
SCANDIR_SORT_NONE
opción.fuente
Solo corrige tu código así:
<?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"; } ?>
fuente
Utilizo este método en mi complemento 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 }
Funciona con una extensión específica, pero se cambia fácilmente para adaptarse a sus necesidades eliminando la línea "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 ); }
fuente
Recientemente tuve un problema similar, aunque la respuesta más votada no me funcionó, por lo tanto, tuve que encontrar una solución similar. y, de nuevo, esta puede no ser la forma más eficaz de solucionar el problema,
Creé una función así
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; }
y lo usé para buscar dricetory vacío como tal
if(is_empty_dir($path)){ rmdir($path); }
fuente
Puedes usar esto:
function isEmptyDir($dir) { return (($files = @scandir($dir)) && count($files) <= 2); }
fuente
La primera pregunta es ¿cuándo está vacío un directorio? En un directorio hay 2 archivos, el '.' y '..'.
Junto a eso en una Mac, tal vez esté el archivo '.DS_Store'. Este archivo se crea cuando se agrega algún tipo de contenido al directorio. Si estos 3 archivos están en el directorio, puede decir que el directorio está vacío. Entonces, para probar si un directorio está vacío (sin probar si $ dir es un directorio):
function isDirEmpty( $dir ) { $count = 0; foreach (new DirectoryIterator( $dir ) as $fileInfo) { if ( $fileInfo->isDot() || $fileInfo->getBasename() == '.DS_Store' ) { continue; } $count++; } return ($count === 0); }
fuente
@ Tu sentido común, @ Enyby
Alguna mejora de su código:
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; }
Utilizo una variable para almacenar el resultado y lo configuro en verdadero.
Si el directorio está vacío, los únicos archivos que se devuelven son. y .. (en un servidor Linux, puede extender la condición para mac si es necesario) y, por lo tanto, la condición es verdadera.
Luego, el valor del resultado se establece en falso y el corte 2 sale del bucle if y while para que la siguiente instrucción ejecutada sea cerrada.
Por lo tanto, el ciclo while solo tendrá 3 círculos antes de que termine, independientemente de si el directorio está vacío o no.
fuente