Aller au contenu

méthode récursive de destruction


ste

Sujets conseillés

Bonjour, all...

je travaille sur un class dans laquelle j'implémente une méthode de destruction recursive qui me pose soucis à-priori :

code de la méthode :

function __delete_tmp($path)
{
$dir['tmp'] = dir($path);

while($this->file['del'] = $dir['tmp']->read())
{
if(is_dir($this->file['del']))
{
$this->__delete_tmp($path.'/'.$this->file['del']);
rmdir($this->file['del']);
}
else unlink($this->file['del']);
}

$dir['tmp']->close();
}

quand je l'appelle ainsi '$this->__undelete_tmp(DIR.'/.')' où DIR est une constante, il me retourne Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 3496 bytes) in /directory/script.php on line 125

la ligne 125 étant $this->__delete_tmp($path.'/'.$this->file['del']); dans la condition if(is_dir(...))

voili, voilou ... y'a certainement quelque chose qui cloche, mais là, je ne le vois pas.

merci d'avance.

Modifié par Dudu
Lien vers le commentaire
Partager sur d’autres sites

Bon, je me répons à moi-même :

j'ai oublié de gérer les fichiers '.' et '..' et je ne retournais pas sur le bon répertoire !

(erreurs de débutants ... tsss)

le bon code est celui-ci :

function __delete_tmp($path)
{
$this->dir = opendir($path);

/*** tant que la condition est correct en type alors on lit ***/
while(false !== ($this->file['del'] = readdir($this->dir)))
{
if($this->file['del'] != '.' && $this->file['del'] != '..')
{
$this->path = $path.'/'.$this->file['del'];

if(is_dir($this->path))
{
$this->__delete_tmp($this->path);
}
else
{
unlink($this->path);
}
}
}

closedir($this->dir);
rmdir($path);
}

Modifié par ste
Lien vers le commentaire
Partager sur d’autres sites

Bon, ça ne me dit pas pourquoi il ne fonctionne pas correctement !

???

il descend au répertoire le plus profond ...

et ne supprime strictement rien !

:mad2:

Lien vers le commentaire
Partager sur d’autres sites

D'un coté, tu as function __delete_tmp($path)

et de l'autre, tu appelles : $this->__undelete_tmp(DIR.'/.')'

Cherches tu au bon endroit ? ;)

Lien vers le commentaire
Partager sur d’autres sites

D'un coté, tu as function __delete_tmp($path)

et de l'autre, tu appelles : $this->__undelete_tmp(DIR.'/.')'

Cherches tu au bon endroit ? ;)

oui, oui ... enfin il me semble bien ...

arfff, pardon : je l'appelle bien par $this->__delete_tmp(DIR.'/.')'; et non $this->__undelete_tmp(DIR.'/.'); :whistling:

Lien vers le commentaire
Partager sur d’autres sites

est ce que ton script fonctionne, sinon pour voir pourquoi cela ne supprime pas, tu peux mettre des traces des repertoires et fichiers qu'il tente de supprimer...

une remarque pertinente sur ton code: tu utilises une méthode récursive avec une variable globale... Pas bon.

tes $this->path et $this->dir sont mis à jour à chaque appel de ta méthode mais quand tu sors de ta méthode (remontée de la récursivité), ces variables ne reviennent pas dans l'état désiré mais dans l'état inférieur, du coup cela ne fait pas grand chose, au mieux cela supprime le premier fichier de ta recherche récursive.

Lien vers le commentaire
Partager sur d’autres sites

Bon, eh bien, j'y suis enfin arrivé à le faire fonctionner.

Voici le code :

function __delete_tmp($path)
{ //var_dump($path);
chmod($path, 0777);
$dir_tmp = opendir($path);

/*** tant que la condition est juste en type alors on lit ***/
while(false !== ($file_tmp = readdir($dir_tmp)))
{
if($file_tmp != '.' && $file_tmp != '..')
{
$path_tmp = $path.'/'.$file_tmp;

if(!empty($path_tmp) && is_file($path_tmp))
{
unlink($path_tmp);
}
else
{
$this->__delete_tmp($path_tmp);
}
}
}

closedir($dir_tmp);
rmdir($path);
}

Pour ceux qui se demandent ce que cela change au fond, j'ai usé dans ce script de variable normale et non de variable array ...

ainsi la méthode fonctionne.

Et, pour info, et pour répondre à Anonymous, l'usage d'une variable globale dans l'appel de la méthode n'est en rien génant.

Une fois le script fonctionnel, j'ai testé avec et sans, et ça roule !!!

++

Modifié par ste
Lien vers le commentaire
Partager sur d’autres sites

Et, pour info, et pour répondre à Anonymous, l'usage d'une variable globale dans l'appel de la méthode n'est en rien génant.

Une fois le script fonctionnel, j'ai testé avec et sans, et ça roule !!!

De quel variable parles tu? $path ou les variables $*_tmp ? S'il s'agit de $path, effectivement cela pourrait fonctionner.Sinon la pile de retour des variables n'étant pas conservée (différence entre l'utilisation d'un environnement local et global), la récurrence ne peut pas s'exécuter comme désirée ($dir_tmp étant modifié par l'appel récursif). De manière générale, il n'est pas recommander d'utiliser des variables globales dans un récursion car le principe de la récursion repose sur la construction d'une pile de retour qui permet de rétablir l'environnement local d'une méthode après l'appel récursif.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...