Je travaille sur une fonction PHP qui supprimera récursivement tous les sous-dossiers qui ne contiennent aucun fichier à partir d'un chemin absolu donné.
Voici le code développé jusqu'à présent: p>
function RemoveEmptySubFolders($starting_from_path) { // Returns true if the folder contains no files function IsEmptyFolder($folder) { return (count(array_diff(glob($folder.DIRECTORY_SEPARATOR."*"), Array(".", ".."))) == 0); } // Cycles thorugh the subfolders of $from_path and // returns true if at least one empty folder has been removed function DoRemoveEmptyFolders($from_path) { if(IsEmptyFolder($from_path)) { rmdir($from_path); return true; } else { $Dirs = glob($from_path.DIRECTORY_SEPARATOR."*", GLOB_ONLYDIR); $ret = false; foreach($Dirs as $path) { $res = DoRemoveEmptyFolders($path); $ret = $ret ? $ret : $res; } return $ret; } } while (DoRemoveEmptyFolders($starting_from_path)) {} }
6 Réponses :
Cette ligne
$ret |= $res;
Cela époperait des problèmes car appelant essayez plutôt de l'essayer de manière récursive: p> testé, fonctionnant bien. Windows 7 PHP 5.3.0 XAMPP P> P> reformulésbolders code> à quelques reprises serait probablement des erreurs, car chaque fois que vous appelez la fonction, les 2 autres fonctions sont définies à nouveau. S'ils ont déjà été définis, PHP lancera une erreur disant que la fonction du même nom a déjà été définie.
Bien sûr, si vous vérifiez si le dossier est vide est effectué après l'appel récursif, cela permettrait d'autoriser l'algorithme beaucoup plus efficace ... honte sur moi: - | Vous aviez raison sur le problème avec les fonctions de nidification, PHP jette une erreur fatale sur le deuxième appel à la fonction extérieure. Merci beaucoup!
Si elle répond, mettez-y =)
Terminé. Je dois dire que le code proposé par Yu_Sha semble mieux répondre à ma question en termes d'amélioration de la performance et je la marquerais comme une réponse acceptée, à condition qu'il n'y aurait pas de bugs dans le code, il pourrait donc être collé-collé.
Si vous avez un dossier vide dans le dossier vide dans le dossier vide, vous devez faire boucle à travers tous les dossiers trois fois. Tout cela, parce que vous allez d'abord le dossier de test avant de tester ses enfants. Au lieu de cela, vous devriez aller dans des dossiers d'enfants avant de tester si le parent est vide, comme un passage sera suffisant.
function RemoveEmptySubFolders($path) { $empty=true; foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file) { $empty &= is_dir($file) && RemoveEmptySubFolders($file); } return $empty && rmdir($path); }
Excellent algorithme! Pour que la fonction fonctionne deux petits bugs soit corrigée: 1. Dossier $ doit être modifié pour $ PATH dans la déclaration de Foreach. 2. $ Dossier doit être transmis comme paramètre à l'appel de la fonction récursif au lieu de $ detad_from_path.
Veuillez noter que si votre fonction fonctionne sous Linux, les sous-répertoires masqués (avec des noms commençant par un point) seront également appariés à tort comme des répertoires «vides».
Comment cela pourrait-il être modifié de manière à ce qu'il ne puisse pas supprimer le dossier racine étant passé? Si le chemin d'origine $ ne contient que des dossiers vides, alors elle aussi est supprimée. Pas de gros problème, je suis juste curieux :)
@ SWL1020, le moyen le plus simple serait de modifier les paramètres en similaire ($ PATH, $ root = TRUE), puis lorsque vous appelez cela à l'intérieur de la boucle récursive, vous seriez supprimé ($ dossier, false), puis la déclaration de retour devrait être $ vide && (! $ root) && rmdir ($ chemin); Vous appelez cette fonction comme vous le feriez normalement.
Glob ($ path. Directory_separator. '{,.} [!
Vous pouvez essayer cela.
Vous pouvez exécuter une commande UNIX pour supprimer les répertoires vides. P>
EXEC ("Recherche $ Début_From_Path -Type D -empty -exec rmdir {} \; 2> / dev / null"); p>
Pourquoi pas seulement Trouver $ DIR -PTY -TYPE D -Delete code>?
Non tu ne peux pas. Parce que vous ne devriez jamais utiliser la fonction "EXEC". Il est dangereux et devrait être désactivé dans n'importe quel environnement de site Web. La seule utilisation acceptable est lorsque vous utilisez PHP-CLI.
solution pour Linux, à l'aide de l'outil de ligne de commande mais plus rapide et plus simple qu'avec PHP PHP Si vous avez besoin de support Windows, utilisez php_os code> constante et ceci- Double p>
for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"`enter code here
@Ben - De Ts - 'Je serais très ravi de voir des idées pour un code de meilleur performant.
Peut-être mieux poster cela à refactormycode.com ?