suppression d'un répertoire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : suppression d'un répertoire

par zeus » 20 juin 2007, 17:33

N'oublie pas mon avertissement sur le fait qu'il ne faut pas qu'un validation JS.
Le fait de vérifier que tu ne passes pas une chaine vide en paramètre à la fonction qui supprime un répertoire me semble être une excellente idée ;)

par béka » 20 juin 2007, 17:10

non non, c'est window.alert et ca marche bien. lol
dsl du dérangement.
Bonne soirée.

par zeus » 20 juin 2007, 16:55

1/ Java != Javascript

2/ D'une manière générale, une validation JS n'est et ne doit être qu'un confort qui doit toujours être doublée d'une validation PHP. Par exemple, dans le code de ta fonction, tu peux tester qu'on ne te passes pas une chaine vide.

3/ Je ne comprends pas trop pourquoi ton code JS ne fonctionne pas bien mais je ne connaissait pas window.error() :-k. Quand tu cliques sur OK, il ne retourne pas TRUE par hasard ?

par béka » 20 juin 2007, 16:44

lorsque je laisse un champ vide, cela mon supprime mon répertoire courant. COmment interdire cele ?
J'ai essayé avec une fonction java :

Code : Tout sélectionner

function confirmation() { var msg = ""; if (document.suppr.dirname_delete.value == "") { msg += "Veuillez saisir un nom de répertoire\n"; document.suppr.dirname_delete.style.backgroundColor = "#F3C200"; window.error(msg); return false; } else { if (window.confirm('Etes-vous sûr de vouloir supprimer ce répertoire ?')) { return true; } else { return false; } } }
et dsans mon formulaire j'ai ça :

Code : Tout sélectionner

<form name="suppr" method="post" action="directory.php" onSubmit="return confirmation();">
J'ai bien la fenetre window qui s'affiche et quand je clique sur ok, ca me supr quand même mon réertoire courant.

par zeus » 20 juin 2007, 15:21

Modération :
béka, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

par béka » 20 juin 2007, 15:05

ben merci beaucoup nickel
En fait, j'avais bien compris ce que tu me disais, avais fait les modifs (les mêmes que toi) mais ca ne marchait ptoujours pas. C'est pour ça que j'ai insisté. Et là je viens de voir mon erreur de débutant... j'avais pas appelé la fonction, j'ai hote. :oops:

par zeus » 20 juin 2007, 14:37

Je ne t'aurais jamais croisé sur le forum, je penserais que tu ne cherches pas à comprendre :-k

Je te donne la solution complète en français, je t'ai donné la ligne en question, ce qu'il fallait faire et tu ne trouves pas :'(
function full_rmdir($dirname)
{
	if ($dirHandle = opendir($dirname))
	{
		$old_cwd = getcwd();
		chdir($dirname);
		
		while ($file = readdir($dirHandle))
		{
			if ($file == '.' || $file == '..') 
				continue;
	                
                        // Si le sous-élément est un répertoire
			if (is_dir($file))
			{
                                // Vidange et suppression de ce répertoire
				if ( !full_rmdir($file))  // <== ICI
					return false;
			}
			else
			{
				if (!unlink($file)) return false;
			}
		}
   
		closedir($dirHandle);
		chdir($old_cwd);
		
		if (!rmdir($dirname)) 
			return false;
   
		return true;
	}
	else
	{
		return false;
	}
}

par béka » 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.

par zeus » 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 ;)

par béka » 20 juin 2007, 14:09

et donc alors, comment je peux modifier ça pour corriger mon problème car là je ne vois pas.

par zeus » 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().

par béka » 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.

par lord.anonymous » 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.

par béka » 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?

par zeus » 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 ;)