Procesarea directoarelor eficient in PHP
3Orice programator web va intampina la un moment dat problema procesarii unui arbore de directoare.Practic, daca doresti sa parcurgi un director cu toate fisierele lui impreuna cu toate subdirectoarele si fisierele aferente vei fi nevoit sa parcurgi un arbore de directoare si fisiere. In acest articol , voi prezenta o metoda de a face acest lucru intr-un mod eficient.
1. Parcurgerea unui director si a tuturor subdirectoarelor alaturi de fisierele aferente
function parcurgeDirector($dir) { if ($dirr = opendir($dir)) { while (false !== ($entry = readdir($dirr))) { if ($entry == '.' || $entry == '..') continue; $newE = $dir.'/'.$entry; if (is_dir($newE)) { //proceseaza director parcurgeDirector($newE); continue; } //proceseaaz fisierul $newE } closedir($dirr); } }
2. Aplicatie – Stergerea unui director si a tuturor subdirectoarelor alaturi de fisierele aferente
O aplicatie la ce am prezentat mai sus este problema stergerii unui director si a subdirectoarelor lui, alaturi de fisierele aferente.Vom aplica aici o functie mai interesanta deoarece are posibilitatea de a face debug, creand o impresie foarte intereasanta end-userului. 🙂
/** * @name : delTree , parametrii OPTIONALI nu vor fi completati niciodata * @description : Sterge un director intreg alaturi de toate subdirectoarele si fisierele aferente * @arguments : @dir : directorul ce urmeaza a fi sters * @debug : sterge director cu debug * @exceptions : fisiere si directoare ce se doresc a fi sarite in momentul stergerii(pastrate) * @levelToStartRemove : nivelul in arborele directorului de la care se doreste inceperea stergerii directoarelor * @currentLevel : nivelul curent(OPTIONAL) * @removeExceptions : exceptiile ce trebuie ignorate(OPTIONAL) * @author : Avadanei Andrei * @copyright : 2009 - Avadanei Andrei **/ function delTree($dir,$debug = FALSE,$exceptions = array(),$levelToStartRemove = 0,$currentLevel = 0,$removeExceptions = array()) { $ok = TRUE; if(in_array($dir,$exceptions)) return $ok; if($currentLevel == 0) { foreach($exceptions as $excpt) { while(strrpos($excpt,'/') !== FALSE) { $exc = substr($excpt,0,strrpos($excpt,'/')); if(!in_array($exc,$removeExceptions)) $removeExceptions[] = $exc; $excpt = $exc; } } } if($dirr = opendir($dir)) { while (false !== ($file = readdir($dirr))) { if ($file == '.' || $file == '..') continue; if(in_array($dir.'/'.$file,$exceptions)) continue; $newE = $dir.'/'.$file; if(is_dir($newE)) { if(in_array($newE,$exceptions)) continue; if($debug == TRUE) echo '<div class="normal">Opened '.$newE.' directory.</div>'; $ok = (delTree($newE,$debug,$exceptions,$levelToStartRemove,$currentLevel+1,$removeExceptions) && $ok); if($debug == TRUE) echo '<div class="normal">Closed '.$newE.' directory.</div>'; } else { if(in_array($newE,$exceptions)) continue; if($debug == TRUE) echo '<div class="normal">File '.$newE.' removed.</div>'; $ok = (unlink($newE) && $ok); } } if (is_dir($dir) && $levelToStartRemove <= $currentLevel) { if(in_array($dir,$exceptions) || in_array($dir,$removeExceptions)) return $ok; if($debug == TRUE) echo '<div class="normal">Directory '.$dir.' removed.</div>'; $ok = (rmdir($dir) && $ok); } closedir($dirr); } return $ok; }
Asadar daca vom executa codul de mai jos, vom sterge din directorul test, toate fisierele si subfolderele care nu sunt test/exceptie_folder sau test/exceptie_fisier.php si care incep de la nivelul 0(inclusiv folderul test va fi sters daca nu ar exista exceptii). De asemenea vom vedea toti pasii facuti de functie,deoarece parametrul debug = TRUE.Functia returneaza TRUE daca nu au aparut probleme/erori.
delTree('test',TRUE,array('test/exceptie','test/exceptie_fisier.php'),0);
3. Aplicatie – copierea unui director complet intr-un alt loc
O alta aplicatie destul de interesanta la problema articolului este copierea unui intreg director cu toate subdirectoarele si fisierele aferente intr-un alt loc specificat de codul PHP.
/** * @name : copyTree * @description : Sterge un director intreg alaturi de toate subdirectoarele si fisierele aferente * @arguments : @from : directorul ce va fi copiat * @to : locatia unde va fi copiat directorul @from * @remove : va sterge imediat dupa mutare fisierul/directorul sursa * @exceptions : fisierele/directoarele ce vor fi ignoarate la copiere/stergere * @author : Avadanei Andrei * @copyright : 2010 - Avadanei Andrei **/ function copyTree($from, $to, $remove = FALSE, $debug = FALSE,$exceptions = array()) { $ok = TRUE; if (is_dir($from)) { if(!is_dir($to)) $ok = (mkdir($to) && $ok); if($debug == TRUE) echo '<div class="normal">Created '.$to.' target directory.</div>'; if(in_array($from,$exceptions)) return $ok; if ($dirr = opendir($from)) { if($debug == TRUE) echo '<div class="normal">Created '.$from.' source directory.</div>'; while (false !==($entry = readdir($dirr))) { if ($entry == '.' || $entry == '..') continue; if(in_array($from.'/'.$entry,$exceptions)) continue; $newE = $from.'/'.$entry; if (is_dir($newE)) { $ok = (copyTree($newE, $to.'/'.$entry,$remove,$debug,$exceptions) && $ok); continue; } $ok = (copy($newE, $to.'/'.$entry) && $ok); if($debug == TRUE) echo '<div class="normal">Moved from '.$newE.' to '.$to.'/'.$entry.' file.</div>'; if($remove == TRUE) { $ok = (unlink($newE) && $ok); if($debug == TRUE) echo '<div class="normal">Removed '.$newE.' source file.</div>'; } } closedir($dirr); } if($remove == TRUE) { $ok = (rmdir($from) && $ok); if($debug == TRUE) echo '<div class="normal">Removed '.$from.' source directory.</div>'; } } else { if(in_array($from,$exceptions)) return $ok; $ok = (copy($from,$to) && $ok); if($debug == TRUE) echo '<div class="normal">Moved from '.$from.' to '.$to.' file.</div>'; if($remove == TRUE) { $ok = (unlink($from) && $ok); if($debug == TRUE) echo '<div class="normal">Removed '.$from.' source file.</div>'; } } return $ok; }
Sa presupunem ca executam codul de mai jos.Functia va copia tot ce se gaseste in folderul test in directorul locatie_noua/test, cu exceptia folderului test/exceptie si a fisierului test/exceptie_fisier.php .De asemenea vom vedea fiecare pas facut,deoarece avem debug = TRUE.Fisierele sursa nu vor fi sterse.
copyTree('test','locatie_noua/test',FALSE,TRUE,array('test/exceptie','test/exceptie_fisier.php'));
Concluzie
Procesarea directoarele, subdirectoarelor si fisierelor aferente este o treaba destul de finuta,care poate fi usurata daca pierzi cateva ore bune pentru a crea niste functii ce iti vor fi utile de-a lungul timpului si proiectelor. Daca mai aveti idei de aplicatii sau orice alte idei, lasati un comentariu si vom incerca sa le rezolvam! 😀
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!
Scrisesem si eu ceva asemanator in PHP. Dar ce ai scris tu mai sus e mult mai complet. Felicitari.
Sa spunem ca ce prezint eu pe blog sunt functii si clase care le-am folosit/folosesc in diverse proiecte. Aceste doua functii si-au facut treaba din plin la un proiect si de aceea le recomand! 🙂
Social comments and analytics for this post…
This post was mentioned on Twitter by worldIT: Procesarea directoarelor eficient in PHP http://goo.gl/fb/Z9ZS #WorldIT…