![[PHP] - Supprimer un dossier à l'aide de la récursivité Thumbnail](/uploads/thumbnails/thumbnailrecursion-5df2577de4aeb.png)
Memo
[PHP] - Supprimer un dossier à l'aide de la récursivité
Nativement php ne propose pas de fonction pour supprimer un dossier contenant des éléments. Nous verrons ici comment faire à l'aide d'une fonction récursive.


Auteur : Guillaume M.
Créé le : 12 Dec 2019
Dernière mise à jour : 16 Dec 2019
Par default, PHP ne propose pas de fonction pour la suppresion d'un dossier contenant des éléments. La seule fonction à disposition pour supprimer un dossier, à savoir rmdir(...)
, ne supprime le dossier que si celui-ci est vide.
Mais alors comment faire ? Et bien PHP nous fournie une autre fonction de suppression qui va nous être utile pour notre "nettoyage" de dossier, c'est la fonction unlink(...)
. Celle-ci supprime tout simplement un fichier.
Bien, partant du principe que nous disposons d'une fonction supprimant les fichiers et d'une autre fonction supprimant les dossiers vide, il nous faut maintenant une méthode pour vider les dossiers de leur contenu pour ensuite procéder à une suppression une fois celui-ci vide.
Sans surprise (comme le suggère le titre :), nous utiliserons un petit algorithme récursif.
Attention : Les fonctions ne se posent pas de questions concernant la suppression d'un fichier... tout fichier supprimé ne passe pas par la case corbeille, autrement dit il sera perdu à jamais, donc prudence :).
Fonctionnement de l'algorithme
Pour faire simple, voici un résumé du fonctionnement de l'algorithme :
-> Pour chaque éléments dans le dossier:
-> Si l'élément est un dossier
nous appelons de nouveau la fonction dessus
-> Sinon (c'est que l'élément est un fichier)
on supprime le fichier
-> Fin de l'itération, on passe à l'élément suivant
La récursion entre en jeu lorsque la fonction rencontre un dossier, en effet nous rappelons cette même fonction à l'intérieur d'elle-même.
Introduction aux différentes fonctions utilisées
glob(...)
La fonction glob(string $pattern [, int $flags = 0 ] ): array
prend comme argument un pattern de recherche faisant référence au même pattern utilisé pour la manipulation de fichiers sous console (wiki - glob). Par exemple le caractère *
indique "n'importe quel nombre de caractères de n'importe quel caractère même vide".
La fonction renvoie un array contenant le chemin de chaque éléments se trouvant dans le dossier. À noter que la fonction ne descend pas plus bas dans la hiérarchie, autrement dit si la fonction rencontre un dossier, elle récupère son chemin mais ne rentre pas dedans. C'est là que la récursion entre en scène, chaque fois que l'on tombera sur un élement de type "dossier", nous appelerons de nouveau la fonction à l'intérieur d'elle-même (principe de récursion). Ce qui provoquera le bloquage de l'exécution de la fonction appelante en attendant que la fonction appelée en interne termine son job.
is_dir(...)
La fonction is_dir(string $filename ): bool
prend en argument le chemin du dossier et renvoie true
si le le chemin existe et qu'il représente bien un dossier.
unlink(...)
La fonction unlink(string $filename [, resource $context ] ): bool
efface simplement un fichier. Renvoie true
si tout est ok.
rmdir(...)
La fonction rmdir(string $dirname [, resource $context ] ): bool
supprime un dossier vide et renvoie true
si tout est ok.
Définition de la fonction récursive de suppression
Une chose importante avant de définir cette fonction... Nous devons prendre soin de ne jamais appeler rmdir(...)
sur le dossier courant de la fonction appelante, cela "briserait" la récursion. Il faut donc attendre la fin de l'exécution de la fonction pour ensuite supprimé le dossier qui vient d'être vidé.
Voici donc cette fonction :
function deleteTree($dir){
foreach(glob($dir . "/*") as $element){
if(is_dir($element)){
deleteTree($element); // On rappel la fonction deleteTree
rmdir($element); // Une fois le dossier courant vidé, on le supprime
} else { // Sinon c'est un fichier, on le supprime
unlink($element);
}
// On passe à l'élément suivant
}
}
Lorsque la fonction originale a terminé son exécution, il nous reste donc un dossier vide que l'on doit supprimer, ce qui nous donne en condition réelle :
$dir = "path/to/folder";
deleteTree($dir); // On vide le contenu de notre dossier
rmdir($dir); // Et on le supprime