Déplacer des fichiers et supprimer des dossiers

zut69 Messages postés 354 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 26 juin 2012 - 9 juil. 2007 à 13:45
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 9 juil. 2007 à 18:40
Bonjour,

Voilà j'ai un dossier photos avec pleins d'images, cependant je voudrais que mon code ouvre tous les sous-dossiers de "photos", ainsi que leurs sous-dossiers, sous-sous-dossiers, ... et que dès qu'il rencontre un fichier, il le déplace à la racine du dossier photo, pour finalement supprimer tous ces dossiers et sous-dossiers.
NB: le seul dossier qu'il ne doit pas traiter s'appelle "miniatures".

avant le script:

photos -> miniatures -> mini_1.jpg
                                     mini_2.jpg
                vacances - > sous_dossier -> ma_photo.png
                                     photo.jpg
               john.jpg
               kevin.jpg
etc...
après:

photos -> miniatures -> mini_1.jpg

                                     mini_2.jpg

                john.jpg
                kevin.jpg
                ma_photo.png

                photo.jpg

donc voilà, pour cela j'ai écrit le script suivant, il ne marche pas, ca a visiblement l'air d'etre un problème de chemin des répertoires. Voici le code, j'ai tout essayé pour le corriger j'espere que qqn pourra m'aider:

function detect_dir($rep)
{
$dir = opendir($rep);
    while($f = readdir($dir))
    {
       $rep = $rep."/".$f;
       if(is_dir($f))
       {
       if($f != "." && $f != "..")
       {
        detect_dir($rep);
        rmdir($rep);
       }
       }
       elseif(is_file($rep.$f))
       {
        copy($rep,$url."/clients/".the_path.$f);
        unlink($rep);
       }
    }
closedir($dir);
}

$the_path = "photos/";
$dir = opendir($the_path);
    while($f = readdir($dir))
    {
       if(is_dir($the_path.$f) && $f != "miniatures" && $f != "." && $f != "..")
       {
        detect_dir($the_path.$f);
        rmdir($the_path.$f);
       }
    }
closedir($dir);,

----

En fait dans la partie verte, je liste le contenu du dossier photo, s'il trouve un dossier il le soumet à la fonction en bleu et ensuite le supprime.
Ma fonction liste le dossier, s'il trouve un autre dossier elle se relance elle-même mais en soumettant le nouveau répertoire, sinon si c est un fichier, il en fait une copie dans le dossier photo et ensuite le supprime (en gros il le déplace).
Le principe a l'air bon, ca devrait marcher !
J'ai vraiment besoin d'aide,
merci d'avance à tous,
FF

3 réponses

cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
9 juil. 2007 à 15:33
Salut,
il y a un problème
vous faîtes:

       $rep = $rep."/".$f;
puis
       elseif(is_file($rep.$f))
donc quand vous testez si c'est un fichier  vous testez $rep."/".$f.$f au lieu de $rep."/".$f.
de plus vous testez également if(is_dir($f)) au lieu de if(is_dir($rep) (ou if(is_dir($rep."/".$f) )
(Rq : on peut aussi déplacer un fichier en le renommant plutôt quand le copiant puis supprimant).

http://kysicurl.free.fr/
0
zut69 Messages postés 354 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 26 juin 2012 1
9 juil. 2007 à 17:03
Merci beaucoup, en corrigeant ces erreurs, ainsi que quelques autres que j'ai trouvé et ben ça marche !

Voici mon code qui marche déjà bien mieux au cas ou ca intéresserait quelqu'un:

function detect_dir($rep)
{
$dir = opendir($rep);
    while($f = readdir($dir))
    {
       if(is_dir($rep."/".$f) && $f != "." && $f != "..")
       {
        detect_dir($rep."/".$f);
        rmdir($rep."/".$f);
       }
       elseif(is_file($rep."/".$f))
       {
        if($f != "Thumbs.db") copy($rep."/".$f,"photos/".$f);
        unlink($rep."/".$f);
       }
    }
closedir($dir);
}

$the_path = "photos/";
$dir = opendir($the_path);
    while($f = readdir($dir))
    {
       if(is_dir($the_path.$f) && $f != "miniatures" && $f != "." && $f != "..")
       {
        detect_dir($the_path.$f);
        rmdir($the_path.$f);
       }
    }
closedir($dir);
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 juil. 2007 à 18:40
Hello,

et en PHP5, un exemple à la va vite :

<?php
function moveAllTo ($sStart, $sTo) {
    if (!is_dir ($sStart)) {
        throw new Exception ($sStart.' is not a valid source directory');
    }
    if (!is_dir ($sTo)) {
        throw new Exception ($sTo.' is not a valid target directory');
    }
    $itDir = new RecursiveIteratorIterator (new RecursiveDirectoryIterator($sStart, RecursiveDirectoryIterator::CURRENT_AS_FILEINFO), RecursiveIteratorIterator::SELF_FIRST);
    while (true === $itDir -> valid ()) {
        if (false === $itDir -> isDot () && $itDir -> isFile()) {
            $sCur = $itDir -> current ();
            $sNew = $sTo.'/'.basename ($sCur);
            echo 'renaming ', $sCur, ' to ', $sNew, '
';
            rename ($sCur, $sNew);
        }
        $itDir -> next ();
    }
}

moveAllTo ('bli', '.');
?>
0
Rejoignez-nous