suppression d'un répertoire

Mammouth du PHP | 536 Messages

20 juin 2007, 11:37

bonjour tout le monde,

je voulais savois comment faire pour supprimer un répertoire et tout son contenu ?

merci bien.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 11:40

La fonction PHP qui supprime un répertoire vide est rmdir(). Regarde dans les commentaire de la fonction, tu as des tas de propositions de fonctions permettant de vider un répertoire et de le supprimer ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 536 Messages

20 juin 2007, 11:48

ouais ca j'ai bien pigé que c'était cette fonction.
J'ai essayé ce code,
//suppression d'un répertoire?>
  <form method="post" action="directory.php">
  <fieldset>
    <legend>Supprimer un répertoire</legend>
    <p><label for="dirname_delete">Nom du r&eacute;pertoire &agrave; supprimer : </label><input type="text" name="dirname_delete" /></p>
    <p><input type="submit" name="valider" value="Supprimer le répertoire" /></p>
  </fieldset>
  </form>
  <?
  if(isset($_POST['dirname_delete']))
  {
    $dirname = $_POST['dirname_delete'];
    function full_rmdir($dirname)
    {
    if ($dirHandle = opendir($dirname))
    {
      $old_cwd = getcwd();
      chdir($dirname);
       
      while ($file = readdir($dirHandle))
      {
        if ($file == '.' || $file == '..') continue;
           
        if (is_dir($file))
        {
          if (!rmdir_rf($file)) return false;
        }
        else
        {
          if (!unlink($file)) return false;
        }
      }
       
      closedir($dirHandle);
      chdir($old_cwd);
      if (!rmdir($dirname)) return false;
       
      return true;
    }
    else
    {
      return false;
    }
    }
  }
  //fin de suppression d'un répertoire
mais ca ne marche pas. Peut-on alors supprimer un rep quand un utilisateur clique sur son nom plutot que de saisir dans un formulaire son nom.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 11:51

En ce qui concerne la fonction, je te conseille d'essayer de la comprendre.
Il y a une notion de récursivité (la fonction s'appelle elle même) qu'il te faut comprendre avant de changer le nom de la fonction ;)

Sinon, pour ton autre problème, à partir du moment où tu peux donner une url à ton script PHP, pas de soucis.
Imaginons que le répertoire soit un lien vers un script PHP qui récupère l'URL de ce répertoire et le supprime ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 536 Messages

20 juin 2007, 11:54

et coment faire ceci ? je te demande pas de me donner le script, je vais chercher moi même...

Parceque, là avec ceci ;
$dir = opendir("./rep");
    $fichier = array();
    echo "Voici les répertoires contenus dans le dossier \'directory\' : <br />";
    echo "<ul>";
    while ($nom = readdir($dir)) {
      $fichier[] = $nom;
      echo "<li>".$nom."</li>";
      }
    echo "</ul>";
    closedir($dir);
j'affiche tout ce qui se trouve dans le répertoire ou je veux que les utilisateurs créent des rep... mais ce script affiche TOUT (en vrac) et moi je voudrais qu'il fasse bien la distinction entre fichier et rep.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 12:00

Pour comprendre pourquoi la fonction ne tourne pas, il faut la comprendre :

Commente moi cette fonction pour comprendre ce qu'elle fait :
function full_rmdir($dirname)
{
	if ($dirHandle = opendir($dirname))
	{
		$old_cwd = getcwd();
		chdir($dirname);
		
		while ($file = readdir($dirHandle))
		{
			if ($file == '.' || $file == '..') 
				continue;
	   
			if (is_dir($file))
			{
				if ( !rmdir_rf($file)) 
					return false;
			}
			else
			{
				if (!unlink($file)) return false;
			}
		}
   
		closedir($dirHandle);
		chdir($old_cwd);
		
		if (!rmdir($dirname)) 
			return false;
   
		return true;
	}
	else
	{
		return false;
	}
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 536 Messages

20 juin 2007, 12:13

function full_rmdir($dirname) //apel de la fonction avec comme parametre la variable dirname qui correspond au nom du rep a suppr
{
    if ($dirHandle = opendir($dirname))  //on ouvre le répertoire $dirname
    {
        $old_cwd = getcwd();            //retourne le dossier courant (celui où on se trouve) ds la var $dirHandle
        chdir($dirname);                //on va dans le répertoire $dirname
        
        while ($file = readdir($dirHandle))   //tant qu'on trouve un fichier dans le répertoire que l'on vient d'ouvrir 
        {
            if ($file == '.' || $file == '..') //si c'est le rep curant ou le rep parent, on ne fait rien, on continue 
                continue;
       
            if (is_dir($file))                //si c'est un dossier (appelé $file)) alors
            {
                if ( !rmdir_rf($file))          //???????
                    return false;               //sinon on retourne false
            }
            else                              //sinon
            {
                if (!unlink($file)) return false; //si on a pas pu supppr le fichier a l'intérieur du repertoire, on retourne false
            }
        }
   
        closedir($dirHandle);                //on ferme le repertoire dans le quel on se trouve
        chdir($old_cwd);                     //on revient au rep parent
        
        if (!rmdir($dirname))               //si on a pa pu suppr supprimer le repertoire
            return false;                   //on retourne false
   
        return true;
    }
    else
    {
        return false;
    }
} 
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 13:19

if ( !rmdir_rf($file))          //???????
C'est ce qui me semblait.

Cette ligne, qui se situe dans un if signifiant "L'objet parcouru est un répertoire", réalise l'action suivante : "Je lance la fonction de nettoyage de ce répertoire".

Tu as changé le nom de la fonction majeure en "full_rmdir" mais tu n'as pas changé cet appel à la fonction ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 536 Messages

20 juin 2007, 13:24

j'ai rien changé, regarde le 2eme comment (http://fr.php.net/rmdir)
Mais sinon ok, je vé regarder. SInon peut-on avoir un message de confirmation de la suppression?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Eléphant du PHP | 216 Messages

20 juin 2007, 13:26

Un petit détail: chez Free, la fonction rmdir() est désactivée. Il est impossible d'effacer un répertoire par script, c'est uniquement faisable en FTP.

Mammouth du PHP | 536 Messages

20 juin 2007, 13:34

merci bien, mais là où je travaille, la fonction rmdir marche correctement. Mais merci quand même.

Sinon qu'est-ce qui ne convient pas dans ce code :
elseif(isset($_POST['dirname_delete']))
  {
    $dirname = $_POST['dirname_delete'];
    function full_rmdir($dirname)
    {
    if ($dirHandle = opendir('./rep/'.$dirname))
    {
        $old_cwd = getcwd();
        chdir('./rep/'.$dirname);
        
        while ($file = readdir($dirHandle))
        {
            if ($file == '.' || $file == '..') 
                continue;
       
            if (is_dir($file))
            {
                if ( !rmdir($file)) 
                  return false;
            }
            else
            {
                echo "is_dir";
                if (!unlink($file)) return false;
            }
        }
   
        closedir($dirHandle);
        chdir($old_cwd);
        
        if (!rmdir('./rep/'.$dirname)) 
            return false;
   
        return true;
    }
    else
    {
      return false;
    }
    }
sachant que je passe le nom du repertoire à supprimer à l'aide d'un formulaire, que ma page directory.php se trouve à la racine et que je veux que les utilisateurs puissent suppr et modif des repertoires dans un repertoire prévu à cet affet (nommé "rep") et qui est au même niveau que ma page directory.

arborescence :

Code : Tout sélectionner

directory.php rep sous rep1 sous rep2...
(sous rep1... sont les repertoires que les utilisateurs peuvent ajouter ou supprimer.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 14:04

Dans ton code, quand tu veux supprimer un répertoire, tu le parcours, tu le vides et tu supprimes chaque élément. Sauf que quand l'un de éléments qui se trouvent dans le dossier est lui même un dossier, tu ne contrôle pas s'il est vide ou pas avant d'appliquer la fonction rmdir().
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 536 Messages

20 juin 2007, 14:09

et donc alors, comment je peux modifier ça pour corriger mon problème car là je ne vois pas.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 14:16

Donc, tu aurais regardé ce que j'ai nommé "Récursivité", tu le saurais.

:arrow: Tu codes une fonction qui te permet de vider un répertoire et de le supprimer
:arrow: Dans le code de cette fonction, quand tu tombes sur un répertoire, il te faut le vider et le supprimer

Solution : Dans le code de ta fonction, tu rappelles la fonction ... c'est ce qu'on appelle la récursivité ;)

ATTENTION : il faut prendre garde à ce que la fonction ne s'appelle pas en boucle. Par exemple dans ta fonction, la fonction s'appellera elle même tant qu'elle trouvera un sous-répertoire mais quand l'arborescence se terminera, elle va commencer à dépiler les appels ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 536 Messages

20 juin 2007, 14:24

nonmais ça j'ai bien compris, mais je n'arrive pas à mettre en application car sinon le raisonnement je l'ai bien compris.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!