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 :

Récupérer nom fichier + nom répertoire [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut Récupérer nom fichier + nom répertoire
    Bonjour tout le monde.

    Alors voilou, je suis en train d'essayer de me faire un script pour déplacer un très grand nombre d'images.
    Plus précisément, ces images se situent dans différents dossiers ayant un nom spécifique et je dois les déplacer dans des dossiers qui ont le même nom que celui d'origine.

    Je cherche donc à stocker dans un tableau le nom de chaque image mais également le nom du répertoire dans lequel elle se trouve afin de pouvoir comparer ce nom de répertoire émetteur avec le nom du répertoire destinataire pour que les images soient déplacées au bon endroit.

    Voici la fonction avec laquelle je stocke (enfin j'essaie) le nom de fichier + répertoire émetteur :
    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
    function scanDirectory($directory) {
        $i = 0;
        $myDirectory = opendir($directory) or die('Erreur : ouverture impossible du dossier ' . $directory);
        while($entry = @readdir($myDirectory)) {
     
            if ($entry != '.' && $entry != '..') {
                if(is_dir($directory . $entry)) {
                    $files = scanDirectory($directory . $entry);
     
                    foreach ($files as &$file)
                        $file = $entry . "/" . $file;
                }
                else {
                    $files[$i] = $entry;
                }
                $i++;
            }
        }
        closedir($myDirectory);
        return $files;
    }
    Comme vous pouvez le voir, à chaque fois qu'elle va trouver un répertoire, mon tableau (que je veux retourner à la fin) est écrasé. Donc forcément, je n'aurais que les fichiers les moins récents (à cause de la fonction readdir qui prend en premier les fichiers/dossiers les plus récemments modifiés) dans mon tableau.

    Je n'arrive pas à trouver comment contourner mon souci. Je m'en remets à vous

    Merci d'avance !

    EDIT : PS : désolé si ce sujet n'est pas dans la bonne section mais je ne savais pas trop où le mettre...

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Pourquoi ne pas déplacer au fur et à mesure de ton parcours ?
    Tu trouve un dossier tu le crée si il n'existe pas , tu trouve un fichier tu le déplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $dossier = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(dirname(__FILE__)),true);
    foreach($dossier as $file)
    {
    	if($file->isDir())
    		//Création dossier
    	else
    		//Copy fichier
     
    }

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ouais pas bête du tout ça !

    Mais, suis-je obligé de le faire avec un objet RecursiveIteratorIterator ? Avec la méthode que j'ai ça ne fonctionnerait pas ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Tu peux utiliser la méthode que tu veux , le RecursiveDirectoryIterator est juste plus simple et plus pratique à mon gout

  5. #5
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    okay, j'vais creuser la question. Merci

  6. #6
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Bon j'en chie. Pour une raison inconnue, il refuse de m'ouvrir le répertoire à copier.

    Voici mon code :
    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
    function copyFiles($sendDir, $receiveDir) {
        $mySendDir = opendir($sendDir) or die('Erreur : ouverture impossible du dossier ' . $sendDir);
        while($entry = @readdir($mySendDir)) {
     
            $rep = "";
            if ($entry != '.' && $entry != '..') {
     
                if(is_dir($sendDir . $entry)) {
                    copyFiles($sendDir, $receiveDir);
                    $rep = $entry;
                }
                else {
                    $myReceiveDir = opendir($receiveDir) or die('Erreur : ouverture impossible du dossier ' . $receiveDir);
                    while($newEntry = @readdir($myReceiveDir)) {
     
                        if ($newEntry != '.' && $newEntry != '..') {
     
                            if (is_dir($newEntry) && $newEntry == $rep)
                                exec("cp " . $sendDir . $newEntry . " " . $receiveDir  . $rep);
                            else
                                exec("mkdir " . $receiveDir . $rep);
                        }
                    }
                    closedir($myReceiveDir);
                }
            }
        }
        closedir($mySendDir);
    }
     
    copyFiles("/home/mickael/Documents/dossier_from/", "/home/mickael/Documents/dossier_to/");
    J'ai vérifié les permissions des dossiers, tout est bon. Chiant

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Points : 55
    Points
    55
    Par défaut
    Salut,

    Quel message d'erreur ton opendir() reporte t-il ?


    Cordialement,


    Kohntark-

  8. #8
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Plop.

    Ben vu que j'ai mis un "or die()" il me dit ce qu'il y a dedans. Mais si j'enlève le die(), ça ne me retourne aucune erreur.

    Peut-être faut-il que je rajoute quelque chose pour qu'il me retourne une erreur ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Plop.

    Ben vu que j'ai mis un "or die()" il me dit ce qu'il y a dedans. Mais si j'enlève le die(), ça ne me retourne aucune erreur.

    Peut-être faut-il que je rajoute quelque chose pour qu'il me retourne une erreur ?
    C'est surtout que l'affichage des erreurs ne doit pas être activé.
    Pour le debug tu peux placer ces lignes tout en haut de ta page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    ini_set('display_errors', 1);
    error_reporting(-1);
    ?>

    Cordialement,

    Kohntark-

  10. #10
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    ok merci. Voici l'erreur retournée :
    Warning: opendir(/home/mickael/Documents/dossier_from/): failed to open dir: Too many open files in /var/www/projet-photos/fonctions.php on line 4

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    ok merci. Voici l'erreur retournée :
    Too many open files
    bah voilà, tu as ta réponse.

    A quoi ressemble l'arborescence sur laquelle tu travailles ?
    nb de fichiers par répertoires, nb de dossiers, profondeurs des dossiers, ...
    juste pour avoir une idée à la louche.

    Manifestement ta fonction récursive liée à cette structure ne pourra fonctionner telle quelle.

    C'est une opération que tu ne dois réaliser qu'une seule fois ou se reproduira t elle régulièrement dans l'avenir ?


    Cordialement,


    Kohntark-

  12. #12
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Bah c'est bizarre parce que j'ai changé la manière dont j'allais procéder et il arrive très bien à aller lire dans mes dossiers cette fois...

    Bon, je développe ^^
    Alors, pour l'instant je test sur des dossiers bidons, situés dans le dossier Documents de mon Ubuntu (voir le screenshot de l'arborescence ci-joint).

    Voici le code qui devrait me permettre le déplacement :
    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
    <?php
     
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    include("fonctions.php");
     
    $pathFrom = "/home/mickael/Documents/dossier_from";
    $pathTo = "/home/mickael/Documents/dossier_to";
     
    $dirsFrom = scanRep($pathFrom);
    $dirsTo = scanRep($pathTo);
     
    foreach ($dirsFrom as &$dirFrom) {
        foreach ($dirsTo as &$dirTo) {
            if ($dirFrom == $dirTo)
                exec("mv " . $pathFrom . "/" . $dirFrom . " /* " . $pathTo . "/" . $dirTo . "/") or die("Déplacement impossible.");
            else {
                exec("mkdir " . $pathTo . "/" . $dirFrom);
                exec("mv " . $pathFrom . "/" . $dirFrom . " /* " . $pathTo . "/" . $dirTo . "/") or die("Déplacement impossible.");
            }
        }
    }
     
    ?>
    Et le code de la fonction scanRep :
    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
    /**
     * Permet de lister dans un tableau les repertoires de $dir.
     * @param <string> $dir le chemin du dossier que l'on veut analyser
     * @return <tab> $dirs le tableau contenant les dossiers
     */
    function scanRep($dir) {
        $i = 0;
        $dirs = array();
        $myDir = opendir($dir) or die('Erreur : ouverture impossible du dossier ' . $dir);
        while($entry = @readdir($myDir)) {
     
            if ($entry != '.' && $entry != '..') {
     
                if(is_dir($dir . "/" . $entry))
                    $dirs[$i] = $entry;
                $i++;
            }
        }
        closedir($myDir);
        return $dirs;
    }

  13. #13
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ca y est, j'ai réussi à y faire fonctionner ^^ Pour ceux qui ça intéresserait, voici le code que j'emploie :

    - page principale
    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
    include("fonctions.php");
     
    $pathFrom = "/home/mickael/Documents/dossier_from"; // Chemin du répertoire émetteur.
    $pathFrom = str_replace(' ', '\ ', $pathFrom); // On remplace les espaces par '\ ' au cas où certains dossier auraient des espaces.
    $pathTo = "/home/mickael/Documents/dossier_to"; // Chemin du répertoire destinataire.
    $pathTo = str_replace(' ', '\ ', $pathTo); // On remplace les espaces par '\ ' au cas où certains dossier auraient des espaces.
     
    $dirsFrom = scanRep($pathFrom);
    $dirsTo = scanRep($pathTo);
     
    foreach ($dirsFrom as $key=>$source) {
     
        $keyTo = array_search($source, $dirsTo); // On récupère la clé du tableau $dirsTo où se situe $source.
     
        if(in_array($source, $dirsTo)) {
     
            $source = str_replace(' ', '\ ', $source); // Remplacement des espaces.
            $dirsTo[$keyTo] = str_replace(' ', '\ ', $dirsTo[$keyTo]); // Remplacement des espaces.
     
            exec('mv ' . $pathFrom . '/' . $source . '/* ' . $pathTo . '/' . $dirsTo[$keyTo] . '/'); // On déplace les fichiers contenus dans le dossier.
     
        }
        else {
            exec('mv ' . $pathFrom . '/' . $source . '/ ' . $pathTo . '/'); // On déplace le dossier.
        }
    }
    - fonctions.php
    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
    /**
     * Permet de lister dans un tableau les sous repertoires de $dir.
     * @param <string> $dir le chemin du répertoire dont on veut lister les sous répertoires
     * @return <tab> $dirs le tableau contenant les répertoires
     */
    function scanRep($dir) {
        $i = 0;
        $dirs = array();
        $myDir = opendir($dir) or die('Erreur : ouverture impossible du dossier ' . $dir); // On ouvre le répertoire. Si erreur, on coupe.
        while($entry = @readdir($myDir)) { // On lit dans le répertoire.
     
             // Les répertoires contiennent tous "." qui indique le répertoire courant
             // et ".." qui indique le répertoire supérieur, on souhaite donc ne pas les enregistrer.
            if ($entry != '.' && $entry != '..') {
     
                if(is_dir($dir . "/" . $entry)) // Si c'est un répertoire, on l'ajoute dans le tableau.
                    $dirs[$i] = $entry;
                $i++;
            }
        }
        closedir($myDir); // On ferme le répertoire.
        return $dirs;
    }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/10/2014, 13h05
  2. [SSRS 2k5] nom de fichier, de répertoire
    Par pastoi dans le forum SSRS
    Réponses: 2
    Dernier message: 17/03/2009, 10h50
  3. Réponses: 3
    Dernier message: 06/05/2008, 14h32
  4. Comment récupérer le nom d'un répertoire ?
    Par kinou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/06/2007, 17h43
  5. [VBA]récupérer nom fichier
    Par jackfred dans le forum Général VBA
    Réponses: 4
    Dernier message: 27/04/2007, 19h57

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