Warning: rmdir(..): Directory not empty

Septembre 2016




Introduction


Lorsque vous tentez d'effacer un dossier en PHP, il peut arriver que vous rencontriez l'erreur suivante:
Warning: rmdir(..): Directory not empty
Eh oui! Vous ne pouvez pas effacer un répertoire avec rmdir si celui-ci n'est pas vide. Il va donc falloir utiliser une fonction composée par vos soins. L'idéal est d'utiliser une fonction récursive qui entre dans le répertoire, le vide puis l'efface. Le fait que cette fonction soit récursive fera en sorte de se rappeler elle-même dans chaque sous-répertoire et ainsi de suite.

Voici à quoi ce genre de fonction peut ressembler:

Le code de la fonction (compatible PHP 5 ou supérieur)


<?

function rmdir_recursive($dir)
{
//Liste le contenu du répertoire dans un tableau
$dir_content = scandir($dir);
//Est-ce bien un répertoire?
if($dir_content !== FALSE){
//Pour chaque entrée du répertoire
foreach ($dir_content as $entry)
{
//Raccourcis symboliques sous Unix, on passe
if(!in_array($entry, array('.','..'))){
//On retrouve le chemin par rapport au début
$entry = $dir . '/' . $entry;
//Cette entrée n'est pas un dossier: on l'efface
if(!is_dir($entry)){
unlink($entry);
}
//Cette entrée est un dossier, on recommence sur ce dossier
else{
rmdir_recursive($entry);
}
}
}
}
//On a bien effacé toutes les entrées du dossier, on peut à présent l'effacer
rmdir($dir);
}
?>
Exemple pour effacer le répertoire "machin"

@rmdir_recursive('machin');
?>

Mise en garde pour la sécurité


Une petite mise en garde: si cette fonction échoue, comme par exemple dans le cas où vous n'avez pas la permission d'effacer un fichier, vous verrez un message d'erreur sur la page web qui risque de donner des renseignements à l'utilisateur sur le contenu de vos répertoires. C'est pourquoi il est préférable de faire précéder l'appel de cette fonction par un arobase pour ne pas afficher les messages d'erreur.

A voir également :

Ce document intitulé «  Warning: rmdir(..): Directory not empty  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.