Site non compatible avec cette vieillerie d'Internet Explorer. Pour une expérience complète, voir la liste des navigateurs supportés.
Thumbnail

 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.


Post-it | PHP

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(...)

Référence php manual

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(...)

Référence php manual

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(...)

Référence php manual

La fonction unlink(string $filename [, resource $context ] ): bool efface simplement un fichier. Renvoie true si tout est ok.

rmdir(...)

Référence php manual

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