91 votes

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 aucun fichier dans le répertoire, il devrait dire vide. Le problème est qu'il continue à dire que le répertoire est vide même s'il y a des fichiers à l'intérieur et vice versa.

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

8 votes

C'est juste une faute de frappe dans votre instruction if. Utilisez == (comparer) au lieu du simple = (assigner).

145voto

Il semble que vous ayez besoin scandir au lieu de glob, car glob ne peut pas voir les fichiers cachés sous 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);
}
?>

Notez que ce code n'est pas le sommet de l'efficacité, car il est inutile de lire tous les fichiers seulement 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 != "..") {
      closedir($handle);
      return false;
    }
  }
  closedir($handle);
  return true;
}

D'ailleurs, n'utilisez pas mots pour remplacer boolean les valeurs. L'objectif même de ces dernières est de vous dire si quelque chose est vide ou non. Un site

a === b

l'expression renvoie déjà Empty ou Non Empty en termes de langage de programmation, false ou true respectivement - ainsi, vous pouvez utiliser le résultat même dans des structures de contrôle comme IF() sans aucune valeur intermédiaire

3 votes

Je pense que nos deux codes sont erronés car j'ai supprimé tous les fichiers du dossier et il dit toujours que le dossier n'est pas vide... y a-t-il un moyen de vérifier les fichiers cachés comme thumbs.db etc sous linux ?

0 votes

Je pense que le dossier FTP est dit .. et . dans le fichier est vide. Comment puis-je vérifier si et supprimer le .. et thumbs.db etc. ?

0 votes

Glob ne supporte pas les fichiers cachés sous linux. Si vous les voulez, vous devez utiliser la solution openir comme dans la réponse supprimée.

79voto

flu Points 3120

Je pense que l'utilisation du Itérateur de système de fichiers devrait être le moyen le plus rapide et le plus facile :

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

Ou en utilisant l'accès aux membres de la classe lors de l'instanciation :

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

Cela fonctionne parce qu'une nouvelle FilesystemIterator pointera initialement sur le premier fichier du dossier - s'il n'y a pas de fichiers dans le dossier, valid() retournera false . (voir la documentation ici .)

Comme l'a fait remarquer abdulmanov.ilmir, vérifiez éventuellement si le répertoire existe avant d'utiliser la commande FileSystemIterator parce qu'autrement, il lancera un UnexpectedValueException .

8 votes

Mmm... j'ai des picotements dans les reins pour celui-là.

3 votes

Vous devez considérer que si $dir n'existe pas, une exception sera levée.

7voto

M42 Points 31888

Utiliser

if ($q == "Empty")

au lieu de

if ($q="Empty")

4voto

Robik Points 3160

Probablement à cause de l'opérateur d'affectation dans if déclaration.

Changez :

if ($q="Empty")

A :

if ($q=="Empty")

4voto

Drmzindec Points 61

Essayez ça :

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

?>

0 votes

Merci. Je l'ai écrit assez rapidement et c'est mon premier message ici @Piotr Nowicki

0 votes

Bien sûr mon pote, c'est juste mon devoir civique ;-) Bienvenue sur StackOverflow !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X