Page 1 sur 1

RecursiveDirectoryIterator filtrer deux sous dossier

Posté : 13 oct. 2018, 21:44
par syper
Bonjour,
J'ai besoin de votre aide je cherche à compter le nombre de fichier d'un répertoire et de ses sous répertoire (sauf deux) voila comment se compose mes dossiers :

Id_USER
---Id_ALBUM
--------MINIATURE (à ignorer)
--------TEMP (à ignorer)
---Id_ALBUM
--------MINIATURE (à ignorer)
--------TEMP (à ignorer)

Voila où j'en suis :
$dossier= '../album/'.$donneesuser['id'];
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dossier));
         
echo iterator_count($files); 
Mais du coup sa ne filtre pas les dossiers qui s'appel : MINIATURE et TEMP.

Help me please....

Merci d'avance.

Re: RecursiveDirectoryIterator filtrer deux sous dossier

Posté : 14 oct. 2018, 17:11
par tesmet
Pour éviter une boucle foreach avec if et compteur, il faut appliquer un filtre sur RecursiveDirectoryIterator en dérivant de RecursiveFilterIterator ou via une fonction avec sa classe fille RecursiveCallbackFilterIterator
 
function filtrer_fichier($fileinfo, $filename, $iterator) {
  // les répertoires à ignorer... il y a peut-être plus simple, mais c'est l'idée
  if(strpos(strtoupper($filename), DIRECTORY_SEPARATOR . 'MINIATURE' . DIRECTORY_SEPARATOR) !== false) return false;
  if(strpos(strtoupper($filename), DIRECTORY_SEPARATOR . 'TEMP' . DIRECTORY_SEPARATOR) !== false) return false;
  // sinon c'est accepté
  return true;
}

$files = new RecursiveIteratorIterator(
  new RecursiveCallbackFilterIterator( // pour filtrer via une fonction
    new RecursiveDirectoryIterator(
      $dossier,
      FilesystemIterator::SKIP_DOTS // pas de répertoire . ou ..
    ),
   'filtrer_fichier' // la fonction ci-haut ou par closure function($fileinfo, $filename, $iterator) {...}
  )
);
         
echo iterator_count($files);
 
ou encore par un filtre regexp avec RecursiveRegexIterator
 
$files = new RecursiveIteratorIterator(
  new RecursiveRegexIterator( 
    new RecursiveDirectoryIterator(
      $dossier,
      FilesystemIterator::SKIP_DOTS // pas de répertoire . ou ..
    ),
    // encore une fois... il y a peut-être plus simple comme regexp, mais c'est l'idée
    '#^((?![/\\\\](MINIATURE|TEMP)[/\\\\]).)*$#i' // pas de répertoire MINIATURE ou TEMP
  )
);
 
echo iterator_count($files);

Re: RecursiveDirectoryIterator filtrer deux sous dossier

Posté : 14 oct. 2018, 20:33
par syper
Bonjour,
Merci tout d'abord de ton intervention.

Et encore merci pour les commentaires qui me permet de bien comprendre (c'est ça qui m'importe).

Re: RecursiveDirectoryIterator filtrer deux sous dossier

Posté : 14 oct. 2018, 20:35
par syper
SUJET RESOLU : je ne peut pas éditer le titre car création lorsque je n'était pas encore inscrit.