Comment supprimer un répertoire et tout son contenu (fichiers et sous-répertoires) en PHP ?
@The Pixel Developer - J'ai ajouté une réponse montrant que.
Comment supprimer un répertoire et tout son contenu (fichiers et sous-répertoires) en PHP ?
La section contribuée par l'utilisateur dans la page de manuel de rmdir
contient une implémentation décente :
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (is_dir($dir. DIRECTORY_SEPARATOR .$object) && !is_link($dir."/".$object))
rrmdir($dir. DIRECTORY_SEPARATOR .$object);
else
unlink($dir. DIRECTORY_SEPARATOR .$object);
}
}
rmdir($dir);
}
}
Consultez la solution que quelqu'un m'a donnée pour la même question : glob semble fonctionner de manière plus agréable : stackoverflow.com/questions/11267086/
Cet appel is_dir
deux fois pour chaque répertoire récurrent. Si l'argument est un lien symbolique, il le suit également au lieu de supprimer le lien symbolique, ce qui n'est pas forcément ce que vous voulez. Dans tous les cas, ce n'est pas ce que rm -rf
ne.
S'appuyer sur Commentaire du développeur Pixel Un extrait utilisant le SPL pourrait ressembler à ceci :
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $fileinfo) {
$todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
$todo($fileinfo->getRealPath());
}
rmdir($dir);
Note : Il n'y a pas de non et utilise le drapeau SKIP_DOTS introduit avec le FilesystemIterator en PHP 5.3.0. Bien sûr, l'option $todo
pourrait être un if
/ else
. Le point important est que CHILD_FIRST
est utilisé pour itérer sur les enfants (fichiers) avant leurs parents (dossiers).
Nous vous remercions. Par ailleurs, ne devriez-vous pas utiliser l'option getPathname()
au lieu de la méthode getRealPath()
?
La réponse n'est qu'un exemple générique d'itération sur les fichiers d'abord, puis sur leurs dossiers respectifs.
Veuillez noter que cette méthode n'est pas sûre pour les liens symboliques ! Vous avez besoin d'une vérification après is_dir pour vérifier également que c'est !is_link, parce que sinon vous pouvez faire un lien symbolique vers un dossier externe qui est ensuite supprimé et cela peut être considéré comme une faille de sécurité. Vous devez donc changer is_dir("$dir/$file")
a is_dir("$dir/$file") && !is_link("$dir/$file")
Le vrai problème de ce code est que php ne prend pas en charge la récursion, c'est à dire optimisation des appels de queue . La plupart des langages interprétés ne
Il y a un autre fil de discussion avec d'autres exemples ici : Une fonction récursive de suppression de répertoire pour PHP ?
Si vous utilisez Yii, vous pouvez laisser le framework s'en charger :
CFileHelper::removeDirectory($my_directory);
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Voici une bonne approche et une bonne solution : stackoverflow.com/a/15111679/2377343