• Acasă
  • Despre noi
  • Autori
  • Mărturii
  • Arhivă
  • Trimite Articol
  • Contact

WORLDIT

Lumea în 1 și 0.

  • Știri
    • Tehnologie
    • Tehnologie mobilă
    • Securitate
    • Developers
    • Știință
    • Benzi desenate
    • Jocuri
    • Intern
  • Tehnic
    • Browser
    • C#
    • C/C++
    • Challenge
    • HTML/CSS
    • Javascript, Ajax, jQuery
    • Open Source
    • PHP
    • Python
    • Securitate IT
    • Socializare
    • WordPress
    • Altele
  • Recenzii
  • Interviuri
  • Evenimente

Procesarea directoarelor eficient in PHP

3
  • Publicat de Andrei Avădănei
  • în PHP · Tehnic
  • — 14 feb., 2010 at 2:48 pm

Orice 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!

Etichete: copie director in phpdirectoare in phpfisiere in phpPHPprocesarea directoarelor phpsterge director in phptutorial

— Andrei Avădănei a scris 1246 articole

Andrei scrie pe worldit.info din vara lui 2011. Este fondatorul Asociatiei Centrul de Cercetare in Securitate Informatica din Romania - CCSIR si coordoneaza DefCamp, cea mai importanta conferinta de securitate informatica & hacking din Europa Centrala si de Est. Andrei ofera in cadrul Bit Sentinel servicii de securitate informatica, penetration testing, security management, recuperarea de pe urma unui atac cibernetic, training-uri si workshop-uri.

  • Articolul anterior Portal SMS – serviciu de informatii prin SMS
  • Articolul următor Google Chrome urca incet dar sigur

3 Comentarii

  1. AccesInterzis spune:
    februarie 14, 2010 la 3:35 pm

    Scrisesem si eu ceva asemanator in PHP. Dar ce ai scris tu mai sus e mult mai complet. Felicitari.

  2. Avadanei Andrei spune:
    februarie 14, 2010 la 3:38 pm

    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! 🙂

  3. uberVU - social comments spune:
    februarie 14, 2010 la 4:00 pm

    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…


  • Facebook

    WorldIT.info
  • Ultimele Atacuri Cibernetice din Romania – RO Hacked

    • imacoolat-curat.ro
      | Published: februarie 3, 2020 - 2:00 am
    • hotel-palace.ro
      | Published: februarie 2, 2020 - 2:00 am
    • www.tahometru.ro
      | Published: februarie 1, 2020 - 2:00 am
    • alexisart.ro
      | Published: ianuarie 30, 2020 - 2:00 am
    • justshop.ro
      | Published: ianuarie 29, 2020 - 2:00 am
    RO Hacked este registrul atacurilor cibernetice din România.
  • Caută

  • Articole Recomandate

    • Recent Posts
    • Tags
    • Număr record de participanți la DefCamp 2015, cel mai important eveniment dedicat securității cibernetice din Europe Centrala si de Estdecembrie 2, 2015
    • La DefCamp 2015 vei afla prin ce tehnici pot fi evitate măsurile de securitate ale sistemelor informatice criticeoctombrie 16, 2015
    • Ultima sansa sa rezervi bilete de tip Early Bird la DefCamp 2015septembrie 1, 2015
    • 15 sfaturi despre cum poti deveni un programator bun venite de la specialisti romaniaugust 4, 2015
    • algoritmica Android antivirus Apple Avadanei Andrei benzi desenate BitDefender blog browser C++ Chrome concurs eveniment Facebook Firefox Google google chrome hacking html5 infografic informatica internet Internet Explorer IT javascript linux Microsoft Mozilla Firefox online PHP programare retea sociala review Romania securitate Tehnologie Twitter web Windows Windows 7 Wordpress WorldIT worldit.info Yahoo! YouTube
  • ianuarie 2021
    L Ma Mi J V S D
    « dec.    
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • Link-uri Sponsorizate

    • laptop second hand

    • Calculatoare Second Hand

    • cod voucher pc garage

  • Home
  • Tehnic
  • PHP
  • Procesarea directoarelor eficient in PHP
  • Important

    • Bit Sentinel
    • Centrul de Cercetare în Securitate Informatică din România
    • DefCamp
  • Prieteni

    • BetiT.ro
    • bijuterii handmade
    • Computerica | Resurse gratuite PC
    • Descopera.org
    • Gadgeturi si IT – Giz.ro
  • Prieteni

    • PC – Config
    • RO Hacked
    • Stiri IT

Copyright © 2009-2014 WORLDIT. Toate drepturile Rezervate.
Termeni și condiții | Contact | Licența Creative Commons

Multumim foarte mult ca ne-ai raportat greseala! O vom remedia in cel mai scurt timp posibil.