Page 1 sur 2

suppression d'un répertoire

Posté : 20 juin 2007, 11:37
par béka
bonjour tout le monde,

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

merci bien.

Posté : 20 juin 2007, 11:40
par zeus
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 ;)

Posté : 20 juin 2007, 11:48
par béka
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.

Posté : 20 juin 2007, 11:51
par zeus
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 ;)

Posté : 20 juin 2007, 11:54
par béka
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.

Posté : 20 juin 2007, 12:00
par zeus
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;
	}
}

Posté : 20 juin 2007, 12:13
par béka
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;
    }
} 

Posté : 20 juin 2007, 13:19
par zeus
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 ;)

Posté : 20 juin 2007, 13:24
par béka
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?

Posté : 20 juin 2007, 13:26
par lord.anonymous
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.

Posté : 20 juin 2007, 13:34
par béka
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.

Posté : 20 juin 2007, 14:04
par zeus
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().

Posté : 20 juin 2007, 14:09
par béka
et donc alors, comment je peux modifier ça pour corriger mon problème car là je ne vois pas.

Posté : 20 juin 2007, 14:16
par zeus
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 ;)

Posté : 20 juin 2007, 14:24
par béka
nonmais ça j'ai bien compris, mais je n'arrive pas à mettre en application car sinon le raisonnement je l'ai bien compris.