Je me demande, quelle est la façon la plus simple de supprimer un répertoire contenant tous ses fichiers?
J'utilise rmdir(PATH . '/' . $value);
pour supprimer un dossier, cependant, s'il y a des fichiers à l'intérieur, je ne peux tout simplement pas le supprimer.
fclose($create_file);
et lors de la suppression, obtenuWarning: unlink(created_file.xml): Permission denied in...
. Donc, pour éviter de telles erreurs, vous devez fermer les fichiers créés.Réponses:
Il y a au moins deux options disponibles de nos jours.
Avant de supprimer le dossier, supprimez tous ses fichiers et dossiers (et cela signifie récursivité!). Voici un exemple:
Et si vous utilisez 5.2+, vous pouvez utiliser un RecursiveIterator pour le faire sans implémenter la récursivité vous-même:
la source
.
et..
) et elle supprime le chemin résolu, pas le chemin réel.scandir
fonction pour obtenir la liste des dossiers. Assurez-vous simplement de filtrer le '.' et les fichiers «..» de la liste des résultats.explode()
ing un chemin emprunté à l'OS. alanhogan.com/tips/php/directory-separator-not-necessaryJe l'utilise généralement pour supprimer tous les fichiers d'un dossier:
Et puis vous pouvez faire
la source
array_map('unlink', glob("$dirname/*"));
Cela ne vous permet toujours pas de supprimer les répertoires imbriqués dans le dossier.la source
$dir
est généré / fourni, vous devrez peut-être effectuer un prétraitement supplémentaire pour être sûr et éviter les bogues. Par exemple, s'il$dir
peut y avoir un espace non échappé ou un point-virgule, il peut y avoir des effets secondaires indésirables. Ce n'est pas le cas avec les réponses qui utilisent des choses commermdir()
parce qu'il gérera les caractères spéciaux pour vous.system('rmdir '.escapeshellarg($path).' /s /q');
Fonction courte qui fait le travail:
Je l'utilise dans une classe Utils comme celle-ci:
Une grande puissance s'accompagne d'une grande responsabilité : lorsque vous appelez cette fonction avec une valeur vide, elle supprimera les fichiers commençant par root (
/
). Par mesure de sécurité, vous pouvez vérifier si le chemin est vide:la source
$this_func = array(__CLASS__, __FUNCTION__);
array_map($class_func, glob($path.'/*')) == @rmdir($path)
? Je suppose qu'il revient dans les sous-dossiers, mais que fait la partie == @rmdir? Comment le <tableau de booléens> == <booléen> renvoie-t-il la réponse? Vérifie-t-il si chaque valeur de retour de la récursivité est identique à la valeur booléenne de droite?array_map(...)
supprime tous les fichiers du répertoire,@rmdir(...)
supprime le répertoire lui-même./
, j'ai donc ajouté une version protégée à mon message.Comme vu dans la plupart des commentaires votés sur la page de manuel PHP concernant
rmdir()
(voir http://php.net/manual/es/function.rmdir.php ), laglob()
fonction ne retourne pas les fichiers cachés.scandir()
est fourni comme une alternative qui résout ce problème.L'algorithme décrit ici (qui fonctionnait comme un charme dans mon cas) est:
la source
$file
) est un répertoire ou un fichier."$dir/$file"
est le même que$dir . "/" . $file
.Il s'agit d'une version plus courte qui fonctionne très bien pour moi
la source
Vous pouvez utiliser le système de fichiers de Symfony ( code ):
Cependant, je ne pouvais pas supprimer certaines structures de répertoires complexes avec cette méthode, donc vous devez d'abord l'essayer pour vous assurer qu'elle fonctionne correctement.
Je pourrais supprimer ladite structure de répertoires en utilisant une implémentation spécifique de Windows:
Et juste pour être complet, voici un ancien code à moi:
la source
Ici, vous avez une récursion agréable et simple pour supprimer tous les fichiers du répertoire source, y compris ce répertoire:
La fonction est basée sur la récursivité effectuée pour copier le répertoire. Vous pouvez trouver cette fonction ici: Copiez le contenu entier d'un répertoire dans un autre en utilisant php
la source
La meilleure solution pour moi
code:
ps N'OUBLIEZ PAS!
ne transmettez pas de VALEURS VIDE à toutes les fonctions de suppression de répertoire !!! (sauvegardez-les toujours, sinon un jour vous pourriez avoir une CATASTROPHE !!)
la source
Et ça:
la source
La fonction Glob ne renvoie pas les fichiers cachés, donc scandir peut être plus utile lorsque vous essayez de supprimer récursivement une arborescence.
la source
Vous pouvez essayer comme suit:
la source
Je préfère cela car il retourne toujours TRUE quand il réussit et FALSE quand il échoue, et il empêche également un bug où un chemin vide pourrait essayer de tout supprimer de '/ *' !!:
la source
Je veux développer la réponse de @alcuadrado avec le commentaire de @Vijit pour la gestion des liens symboliques. Tout d'abord, utilisez getRealPath (). Mais alors, si vous avez des liens symboliques qui sont des dossiers, cela échouera car il essaiera d'appeler rmdir sur un lien - vous avez donc besoin d'une vérification supplémentaire.
la source
Utiliser DirectoryIterator un équivalent d'une réponse précédente…
la source
Celui-ci fonctionne pour moi:
la source
Quelque chose comme ça?
la source
Petite modification du code d'alcuadrado -
glob
ne voyez pas les fichiers avec le nom de points comme.htaccess
j'utilise scandir et le script se supprime - vérifiez__FILE__
.la source
Exemple pour le serveur Linux:
exec('rm -f -r ' . $cache_folder . '/*');
la source
Supprimer tous les fichiers du dossier
array_map('unlink', glob("$directory/*.*"));
Supprimer tout. * - Fichiers du dossier (sans: "." Et "..")
array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
Supprimez maintenant le dossier lui-même
rmdir($directory)
la source
2 cents à ajouter à CETTE réponse ci-dessus, ce qui est génial BTW
Une fois que votre fonction glob (ou similaire) a analysé / lu le répertoire, ajoutez une condition pour vérifier que la réponse n'est pas vide, ou un
invalid argument supplied for foreach()
avertissement sera lancé. Alors...Ma fonction complète (comme méthode d'objet):
la source
Voici la solution qui fonctionne parfaitement:
la source
Vous pouvez copier les assistants YII
$ directory (string) - à supprimer récursivement.
$ options (array) - pour la suppression du répertoire. Les options valides sont: traverseSymlinks: booléen, si les liens symboliques vers les répertoires doivent également être parcourus. La valeur par défaut est
false
, ce qui signifie que le contenu du répertoire lié ne sera pas supprimé. Seul le lien symbolique serait supprimé dans ce cas par défaut.la source
Faites essayer le code ci-dessus sur php.net
Travaille bien pour moi
la source
Pour les fenêtres:
la source
Comme la solution de Playnox, mais avec l'élégant DirectoryIterator intégré:
la source
Je ne me souviens pas d'où j'ai copié cette fonction, mais il semble qu'elle ne soit pas répertoriée et qu'elle fonctionne pour moi
la source
Simple et facile...
la source
Et ça?
Réfrence: https://paulund.co.uk/php-delete-directory-and-files-in-directory
la source
Si vous n'êtes pas sûr, étant donné que le chemin d'accès est un répertoire ou un fichier, vous pouvez utiliser cette fonction pour supprimer le chemin
la source