Comment puis-je utiliser PHP pour vérifier si un répertoire est vide?

J’utilise le script suivant pour lire un répertoire. S’il n’y a pas de fichier dans le répertoire, il devrait être vide. Le problème est que cela ne fait que continuer à dire que le répertoire est vide même s’il y a des fichiers ARE à l’intérieur et vice versa.

 

Il semble que vous ayez besoin de scandir au lieu de glob, car glob ne peut pas voir les fichiers cachés Unix.

  

Notez que ce code n’est pas le summum de l’efficacité, car il n’est pas nécessaire de lire tous les fichiers pour savoir si le répertoire est vide. Donc, la meilleure version serait

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

Par ailleurs, n’utilisez pas de mots pour substituer des valeurs booléennes . Le but même de ce dernier est de vous dire si quelque chose de vide ou non. Un

 a === b 

expression renvoie déjà Empty ou Non Empty en termes de langage de programmation, FALSE ou TRUE respectivement – vous pouvez donc utiliser le résultat même dans des structures de contrôle comme IF() sans valeurs intermédiaires

Je pense que l’utilisation de FilesystemIterator devrait être le moyen le plus rapide et le plus simple:

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

Ou en utilisant un access de membre de classe sur l’instanciation:

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

Cela fonctionne car un nouvel object de FilesystemIterator pointe initialement sur le premier fichier du dossier – s’il n’y a pas de fichiers dans le dossier, valid() renverra false . (voir la documentation ici .)

Comme indiqué par abdulmanov.ilmir, vérifiez si le répertoire existe avant d’utiliser FileSystemIterator sinon une exception UnexpectedValueException sera lancée.

J’ai trouvé une solution rapide

  

utilisation

 if ($q == "Empty") 

au lieu de

 if ($q="Empty") 

Essaye ça:

 2) { print "Not empty"; } else { print "Empty"; } ?> 

Probablement à cause de l’opérateur d’affectation dans l’instruction if .

Changement:

 if ($q="Empty") 

À:

 if ($q=="Empty") 

C’est un fil très ancien, mais je pensais donner mes dix centimes. Les autres solutions n’ont pas fonctionné pour moi.

Voici ma solution:

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

Court et doux. Fonctionne comme un charme.

Pour une approche orientée object utilisant RecursiveDirectoryIterator de la bibliothèque standard PHP (SPL) .

  

Pas besoin de créer une instance de votre FileHelper quand vous en avez besoin, vous pouvez accéder à cette méthode statique partout où vous en avez besoin, comme ceci:

 FileHelper::isEmpty($dir); 

La classe FileHelper peut être étendue avec d'autres méthodes utiles pour copier, supprimer, renommer, etc.

Il n'est pas nécessaire de vérifier la validité du répertoire à l'intérieur de la méthode car, s'il n'est pas valide, le constructeur de RecursiveDirectoryIterator lancera une UnexpectedValueException qui couvre cette partie suffisamment.

Corrigez simplement votre code comme ceci:

  

@ Votre bon sens

Je pense que votre exemple performant pourrait être plus performant en utilisant une comparaison ssortingcte:

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

J’utilise cette méthode dans mon plugin 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 } 

Il fonctionne par extension spécifique mais est facilement modifiable en fonction de vos besoins en supprimant “new RegexIterator (” line. Count $ all_files “).

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

Je me suis heurté à un problème similaire récemment, même si la réponse la plus élue n’a pas vraiment fonctionné pour moi, c’est pourquoi j’ai dû trouver une solution similaire. et encore une fois, cela peut ne pas être le moyen le plus efficace de régler le problème,

J’ai créé une fonction comme ça

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

et l’a utilisé pour vérifier le répertoire vide comme ça

 if(is_empty_dir($path)){ rmdir($path); } 

Vous pouvez utiliser ceci:

 function isEmptyDir($dir) { return (($files = @scandir($dir)) && count($files) <= 2); } 

La première question est quand un répertoire est-il vide? Dans un répertoire il y a 2 fichiers le ‘.’ et ‘..’.
A côté de cela sur un Mac il peut y avoir le fichier ‘.DS_Store’. Ce fichier est créé lorsqu’un type de contenu est ajouté au répertoire. Si ces 3 fichiers sont dans le répertoire, vous pouvez dire que le répertoire est vide. Donc, pour tester si un répertoire est vide (sans tester si $ dir est un répertoire):

 function isDirEmpty( $dir ) { $count = 0; foreach (new DirectoryIterator( $dir ) as $fileInfo) { if ( $fileInfo->isDot() || $fileInfo->getBasename() == '.DS_Store' ) { continue; } $count++; } return ($count === 0); }