Manipulimi i Direktorive me PHP

Albforumi

Primus registratum
Manipulimi i Direktorive me PHP

Në guidën e mëparshme ju tregova si të manipuloni skedarët duke përdorur fuqinë (dhe thjeshtësinë në të njëjtën kohë) e PHP. Me njohuritë e marra atje, tashmë dini si të lexoni skedarë, shkruani, fshini, etj. Në këtë guidë do ju mësoj si të manipuloni direktoritë për ti kompletuar njohuritë tuaja në punimin me Skedarët e Sistemit (aka FileSystem). Guida e mëparshme nuk është e detyrueshme, por ju këshilloj ti hidhni një sy.</p>
Navigimi nëpër Direktori


Ashtu si jeni mësuar të navigoni direktoritë në nje sistem operativ, edhe në PHP mund të bëni të njëjtën gjë me 2 funksione: chdir() dhe getcwd(). Veprime të tjera si shfaqja e skedarëve kërkojnë më tepër pune, prandaj do i trajtoj më vonë në këtë guidë. Tani të fokusohemi një herë me këto 2 funksione të thjeshtë.</p>


getcwd() – GET Current Working Directory – Përmes këtij funksioni mësojmë se në cilën direktori ndodhemi aktualisht, pra direktoria ku skedari aktual PHP egzekutohet.</p>

&lt;?php
/*
do shfaqe direktorine aktuale.
psh: /feniksi/direktoria
*/
echo getcwd();
?&gt;



chdir() - Change Directory – Ndryshon virtualisht direktorinë e egzekutimit.</p>

&lt;?php
/*
printojme direktorine aktuale.
psh: /feniksi
*/
echo getcwd();
/*
ndryshojme direktorine aktuale
ne /feniksi/direktoria
*/
chdir('direktoria');
echo getcwd();
?&gt;



Përmes këtyre dy funksioneve mund të navigoni lehtësisht sistemin e të shfaqni skedarët që ndodhen nën direktori, të përfshini skedarë, etj. Ky funksionalitet nuk është gjithmonë i domosdoshëm, por është aty nëse ju lind nevoja apo thjeshtë doni të eksperimentoni.</p>
Krijimi i Direktorive


Ashtu si gjithçka tjetër deri tani, edhe krijimi i direktorive arrihet shumë lehtë; vetëm me një funksion i cili është mkdir().</p>

&lt;?php
mkdir('drejt/nje/direktorie');
?&gt;



Kodi i mësipërm ka vetëm një problem. Po sikur direktoritë mëmë “drejt” dhe “nje” mos të egzistojnë, a do krijohet direktoria “direktorie“? Ashtu si e kam shkruar unë kodin jo, por fatmirësisht PHP 5 ofron një parametër rekursiv i cili i krijon automatikisht direktoritë mëmë jo egzistente. Parametri tjetër është niveli i akesit.</p>

&lt;?php
mkdir('drejt/nje/direktorie', 0700, TRUE);
?&gt;

Leximi i Përmbajtjes së Direktorive


Ajo që na intereson nga një direktori nuk është fakti që egziston, por çfarë përmban brenda saj. Me PHP mund të shfletojmë shumë lehtë skedarët dhe nën-direktoritë që një direktori përmban. Shikoni shembullin më poshtë.</p>

&lt;?php
/*
hapim direktorine fiktive 'direktori' e cila
krijohet si risurs per tu perdorur me pas
*/
$h = opendir('direktori');
/*
shfletojme direktorine duke perdorur nje loop while().
Ne momentin qe readdir() nuk gjen me skedare apo direktori,
ai kthen FALSE, duke e mbyllur loop-en while().
*/
while(($skedar = readdir($h)) !== FALSE){
//printojme emrin e skedarit
echo $skedar . '&lt;br /&gt;';
}
//mbyllim risursin e hapur
closedir($h);
?&gt;



Shembulli më sipër është rasti më i thjeshtë për të lexuar një direktori, por mund të bëhet edhe më thjeshtë. PHP 5 ofron një funksion të ri për të paraqitur skedarët e një direktorie të quajtur scandir(). Teorikisht nuk kanë asnjë ndryshim, por në praktikë po. Me funksionin readdir() lexojmë dhe printojmë direkt emrin e skedarit e nëse do donim ta kalonim rezultatin në një vektor, do na duhej të bënim disa ndryshime të vogla. Ndërsa funksioni scandir() i kalon rezultatet direkt në një vektor, të cilin mund ta shfletojmë kur na nevojitet. Pra përdorni funksionin që i përshtatet skenarit tuaj.</p>

&lt;?php
$skedaret = scandir('direktori');
//shfletojmë vektorin dhe printojme rezultatet
foreach($skedaret as $skedari){
echo $skedari . '&lt;br /&gt;';
}
?&gt;



Shembujt e dhënë më sipër janë shumë mirë për aq kohë sa direktoria ka vetëm skedarë brenda. Problemi është se me to nuk marrim përmbajtjen e nën-direktorive që ndodhen brenda, për të krijuar një pemë të plotë të skedarëve. E lehtë për tu zgjidhur! Duke përdorur shembullin e parë (atë me readdir) do të ndërtojmë një funksion i cili shfleton skedarët dhe thërret veten e tij në mënyrë rekursive, për të shfaqur gjithçka që ndodhet brenda direktorive të niveleve më të thella. Gjithashtu kam shtuar edhe kod ekstra për disa kontrolle që i kam shpjeguar tek komentet. Kodi është paksa më kompleks se ato që kemi parë deri tani, sidomos nëse nuk jeni mësuar me rekursivitet, kështu që merrni kohën tuaj.</p>

&lt;?php
function shfaqSkedaret($dir, $niveli){
$h = opendir($dir);

//kontrollojme nese opendir() kthen nje risurs
if($h){
//shfletojme direktorine me nje loop while()
while(($skedar = readdir($h)) != FALSE){
/*
. dhe .. jane aty per te naviguar ne direktorine meme ose
ne direktorine aktuale (ju kujtoj &quot;cd .&quot; dhe &quot;cd ..&quot;,
por ne nuk na duhen dhe prandaj i heqim.
*/
if($skedar != '.' and $skedar != '..'){
/*
gjenerojme hapesira ne baze te nivelit te direktorive,
i cili rritet me cdo thellesi. Thjeshte per nje paraqitje
me te kuptueshme te nen-direktorive.
*/
$hapesira = str_repeat('&amp;nbsp;', ($niveli * 5));
/*
me is_dir() kontrollojme nese vlera e marre i perket nje
direktorie. Nese po, i shtojme nje &gt; perpara (qe ta dallojme
nga skedaret) dhe ri-therrasim funksionin i cili tashme
do shfletoje nen-direktorine e re.
*/
if(is_dir($dir . '/' . $skedar)){
echo $hapesira . '&gt; ' . $skedar . '&lt;br /&gt;';
shfaqSkedaret($dir . '/' . $skedar, $niveli + 1);
} else{
/*
ketu arrijme nese vlera e marre eshte skedar (pra jo direktori)
dhe e printojme ate normalisht.
*/
echo $hapesira . $skedar . '&lt;br /&gt;';
}
}
}
}

//mbyllim risursin
closedir($h);
}

/*
therrasim funksionin per here te pare me dy parametrat perkates.
Parametri i pare eshte direktoria qe duam te shfletojme.
Parametri i dyte eshte niveli fillestar sipas te cilit do te
llogariten hapesirat midis nen-direktorive.
*/
shfaqSkedaret('direktori', 0);
?&gt;

Fshirja e Direktorive


Personalisht nuk e shoh me interes fshirjen e direktorive nga vetë fakti që në disa vite punë me PHP nuk më është dashur ndonjëherë për projekte reale. Megjithatë, secili ka nevojat dhe mënyrën e tij të kodimit, kështu që pse mos ta prekim edhe këtë pikë! Fshirja kryhet vetëm me një funksion, atë rmdir().</p>

&lt;?php
rmdir('direktoria');
?&gt;



Kini parasysh që ky funksion fshin vetëm direktoritë boshe dhe do të prodhojë një Warning nëse direktoria mban skedarë. Edhe në këtë rast na duhet të shkruajmë nje funksion rekursiv i cili është shumë i ngjashëm me funksionin rekursiv për leximin e direktorisë. Funksioni shfleton të gjithë skedarët brenda direktorisë dhe nën-direktorive duke i fshirë e në fund fshin direktorinë që tashmë është bosh.</p>

&lt;?php
function fshiDirektorine($dir){
$h = opendir($dir);

if($h){
while(($skedar = readdir($h)) != FALSE){
if($skedar != '.' and $skedar != '..'){
$vendi = $dir . '/' . $skedar;
if(is_dir($vendi)){
fshiDirektorine($vendi);
} else{
//fshim skedaret
unlink($vendi);
}
}
}
}

closedir($h);
//fshim direktorine qe tashme eshte bosh
rmdir($dir);
}

fshiDirektorine('direktori');
?&gt;



Informacioni që ju kam dhënë deri tani varjon nga fillestarë absolutë në programues mesatar. Funksionet rekursivë që përmenda mund të mos jenë miku më i mirë për fillestarët, por kam besimin se me pak kujdes nuk do i keni problem. Thjeshtë kini parasysh që eksperimentimi është teknika më e mirë për të mësuar e fiksuar gjërat.</p>


Po tani çfarë? Me njohuritë e marra në këtë leksion dhe në “Manipulimin e Skedarëve” jeni të gatshëm të merrni përsipër çdo sfidë që ka të bëjë me skedarët e sistemit. Doni një të bukur? Ndërtoni një Menaxhues Skedarësh (File Manager) me PHP që ofron këto funksionalitete:</p>

Shfaq skedarët e një direktorie me ikona të ndryshme për tipe të ndryshëm skedarësh (pdf, html, doc, etj)
Mund të navigohet nëpër direktori duke shfaqur skedarët përkatës
Direktoritë dhe skedarët mund të fshihen
Mund të krijohen direktori të reja
Skedarëve .txt mund tu shikohet përmbajtja dhe të editohen



Ju duket sfidë e vështirë? Ju siguroj që me ato që keni mësuar mund ta ndërtoni fare thjeshtë. Jepini një mundësi e nëse e krijoni, më tregoni rezultatin sepse jam shumë kurioz
icon_smile.gif
</p>


Mësim të mbarë.</p>


Manipulimi i Direktorive me PHP &euml;sht&euml; nj&euml; postim nga: Feniksi.Com - Thesari i Njohurive</p>
30SDno07XGA

Per me shume artikuj te ngjashem vizitoni: http://www.feniksi.com/?p=515
 
Top