IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Iterator, vérifier si un dossier contient des fichiers


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 39
    Points : 56
    Points
    56
    Par défaut Iterator, vérifier si un dossier contient des fichiers
    Salut,

    J'ai un petit souci...

    Pour la gestion d'albums photo, je scanne avec iterator (récursivement) les répertoires du dossier ../album/ avec la fonction suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    	public function _site_dir_dir_list($path)
    	{
                    if(file_exists($path))
                    {
                            $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
                            $dir = array();
                            while($iterator->valid())
                            {
                                    if(!$iterator->isDot())
                                    {
                                            if($iterator->isDir())
                                            {
                                                    $x = explode($path, $iterator->getPathname(), 2);
                                                    $dir[$x[1]] = $x[1];
                                            }
                                    }
                                    $iterator->next();
                            }
                            return $dir;
                    }
            }
    L'objectif est d'afficher dans une liste déroulante les répertoires disponibles pour sélectionner dans une liste l'album à afficher dans un blog.

    J'utilise une arborescence du type :

    /rep1/
      |---img.jpg
      |---img2.jpg
    /rep2/
      |---/sousrep/img.jpg
      |---/sousrep/img2.jpg
    
    Etc...
    Le souci, c'est que ma fonction me propose :
    Rep1
    Rep2
    Rep2/sousrep
    Rep2/sousrep
    Or, je ne voudrais dans ma liste que les répertoires qui contiennent des fichiers (pas d'autres répertoires tels que rep2 qui ne contient pas de fichiers).

    Autrement dit, je cherche à raccourcir ma liste pour ne pas visualiser les répertoires contenant des sous répertoires et qui n'ont pas d'image stockées directement dedans.

    Savez vous comment je peux vérifier ça à partir de ma fonction ?

    Je sèche depuis un bon moment. Merci de votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    Je vois que le message est vieux, mais voici une solution
    Tu cherche les fichiers et tu met son path dans le tableau
    ca te retournera que deux lignes:
    rep1
    rep2\sousrep

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function _site_dir_dir_list($path)
    	{
                    if(file_exists($path))
                    {
                            $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
     
                            $dir = array();
                            while($iterator->valid())
                            {
     
                                    if(!$iterator->isDot())
                                    {
                                            if($iterator->isFile())
                                            {
    					$dir[$iterator->getPath()]=$iterator->getPath();
                                            }
                                    }
                                    $iterator->next();
                            }
                            return $dir;
                    }
            }
    si tu veux deux fois le rep2/sousrep tu as juste à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function _site_dir_dir_list($path)
    	{
                    if(file_exists($path))
                    {
                            $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
     
                            $dir = array();
                            while($iterator->valid())
                            {
     
                                    if(!$iterator->isDot())
                                    {
                                            if($iterator->isFile())
                                            {
    					$dir[]=$iterator->getPath();
                                            }
                                    }
                                    $iterator->next();
                            }
                            return $dir;
                    }
            }
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 39
    Points : 56
    Points
    56
    Par défaut
    Hello,

    Merci de ta réponse, j'ai toujours pas la solution...

    Fonctionne pas ta soluce, j'avais essayé avec if($iterator->isFile())

    Ça continue à ma retourner les répertoires vides. Pour être plus clair, je veux récupérer que les répertoires qui ont des fichiers à l'intérieur.

    Si un répertoire ne contient que d'autres répertoires (sans fichiers), alors je veux pas qu'il soit retourné par la fonction.

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function _site_dir_dir_list($path, $ext = 'php')
    {
    	$dir = array();
    		$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
    		foreach($iterator as $file)
    		{
    			if($file->isFile() and $file->getExtension() === $ext )
    			{
    				$dir[$file->getPath()] = 0;
    			}
    		}
    		return array_keys($dir);
    }
    //edit:
    // une version que je préfère:
    function _site_dir_dir_list2($path, $closureValidFile)
    {
    	$dir = array();
    		$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
    		foreach($iterator as $file)
    		{
    			if( $closureValidFile($file) )
    			{
    				$dir[$file->getPath()] = 0;
    			}
    		}
    		return array_keys($dir);
    }
     
    $closureValidFile = function(DirectoryIterator $file){
    return $file->isFile() and $file->getExtension() === 'php';
    }
    //Quitte à faire une fonction inefficace et générique, on va jusqu'au bout.
    je comprends pas pourquoi c'est compliqué. bon on peut optimiser deux ou trois trucs mais bon, un an pour ça...
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 39
    Points : 56
    Points
    56
    Par défaut
    En fait, c'est juste que j'ai bloqué là dessus à un instant T et que depuis, je ne me suis pas repenché dessus. Rien de stratégique, juste éliminer les répertoires vides d'une liste dans un backoffice, pour y voir plus clair.

    La solution dans ce cas précis (récupération d'un array() traité ultérieurement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	public function _test($path)
    	{
                    if(file_exists($path))
                    {
                            $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
                            $dir = array();
                            while($iterator->valid())
                            {
                                    if(!$iterator->isDot())
                                    {
                                            if($iterator->isFile())
                                            {
                                                    $x = explode($path, strstr($iterator->getPathname(), '/'.$iterator->getFilename(), true), 2);
                                                    $dir[$x[1]] = $x[1];
                                            }
                                    }
                                    $iterator->next();
                            }
                            return $dir;
                    }
            }
    J'ai simplement récupéré la liste des fichiers (ce sont des images avec différentes extensions, donc c'est chiant de se baser sur getExtension(), retiré le nom du fichier, passé le répertoire en clé du array() après avoir retiré le path depuis la racine du serveur.

    Lorsqu'il y a plusieurs fichiers dans un même répertoire, on a donc plusieurs fois le répertoire qui ressort, mais comme son nom sert de clé dans le array(), il ne reste qu'un occurence unique au final et ça fonctionne parfaitement.

    Merci de votre aide.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par olivier69 Voir le message
    Hello,

    Merci de ta réponse, j'ai toujours pas la solution...

    Fonctionne pas ta soluce, j'avais essayé avec if($iterator->isFile())

    Ça continue à ma retourner les répertoires vides. Pour être plus clair, je veux récupérer que les répertoires qui ont des fichiers à l'intérieur.

    Si un répertoire ne contient que d'autres répertoires (sans fichiers), alors je veux pas qu'il soit retourné par la fonction.
    Je t'a&i donné deux solutions, une qui affiche plusieurs fois les répertoire et un autre qui ne garde qu'une occurrence, je ne comprends pas pourquoi chez toi ça ne fonctionne pas car chez moi (je l'ai testé) et ça retourne ce que tu décris...

    As tu copié toute ma solution ou juste une partie?...

    Voici un code php complet qui ne ressort que les répertoires (sans doublons) de tes dossiers qui possèdent des fichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    function _site_dir_dir_list($path)
    	{
                    if(file_exists($path))
                    {
                            $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
     
                            $dir = array();
                            while($iterator->valid())
                            {
     
                                    if(!$iterator->isDot())
                                    {
                                            if($iterator->isFile())
                                            {
    					$dir[$iterator->getPath()]=$iterator->getPath();
                                            }
                                    }
                                    $iterator->next();
                            }
                            return $dir;
                    }
            }
    		foreach(_site_dir_dir_list("../album") as $tes)
    			echo $tes."<br>";
    		?>
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 39
    Points : 56
    Points
    56
    Par défaut
    Appeler la fonction dans une boucle, je suis pas sur que ce soit la meilleure solution en terme de performance.

    En fait la manière donc j'ai procédé convient parfaitement parce que je dois récupérer un array().

    Il passe ensuite par un système de template et c'est à ce moment que les données sont mises en forme.

    Je pense effectivement que ta solution fonctionne (et je te remercie de ton aide), mais dans mon cas, celle que j'ai mise en oeuvre convient bien.

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    Pour l'appel de la fonction dans la boucle c'est juste que je suis un grand flemmard et que je n'avais pas créer de variable temporaire pour récupérer le tableau.

    Problème résolu

    (pense à le taguer)
    Bonne journée
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 39
    Points : 56
    Points
    56
    Par défaut
    OK, taggué, merci de ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2012, 20h42
  2. Vérifier si un classeur contient des macros
    Par SilkyRoad dans le forum Contribuez
    Réponses: 0
    Dernier message: 25/12/2007, 19h56
  3. Vérifier l'existence et renommer des fichiers
    Par palcoquoz dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 21/06/2007, 17h37
  4. Savoir si un dossier contient des fichiers
    Par navis84 dans le forum Langage
    Réponses: 3
    Dernier message: 23/02/2007, 13h42
  5. Vérifier si une chaine contient des caractères spéciaux
    Par BenoitDenis dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2006, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo