Imazh

Manipulimi i Direktorive me PHP

Duke përdorur fuqinë e PHP, do t’ju tregoj si të manipuloni direktoritë me shumë pak mund. Ju paralajmëroj se disa nga kodet e përfshira nuk janë shumë të thjeshta, por ju siguroj se me vëmendjen dhe dëshirën e duhur për të mësuar, gjithçka do marrë kuptim shpejt. Bashkojini këto njohuri me ato të manipulimit të skedarëve dhe do jeni një direktori-shfletues i papërmbajtshëm.

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.

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ë.

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.

<?php
/*
do shfaqe direktorine aktuale.
psh: /feniksi/direktoria
*/
echo getcwd();
?>

chdir() - Change Directory – Ndryshon virtualisht direktorinë e egzekutimit.

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

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.

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().

<?php
mkdir('drejt/nje/direktorie');
?>

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.

<?php
mkdir('drejt/nje/direktorie', 0700, TRUE);
?>

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ë.

<?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 . '<br />';
}
//mbyllim risursin e hapur
closedir($h);
?>

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.

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

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.

<?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 "cd ." dhe "cd ..",
               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('&nbsp;', ($niveli * 5));
                    /*
                    me is_dir() kontrollojme nese vlera e marre i perket nje
                    direktorie. Nese po, i shtojme nje > 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 . '> ' . $skedar . '<br />';
                         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 . '<br />';
                    }
               }
          }
     }

     //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);
?>

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().

<?php
rmdir('direktoria');
?>

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.

<?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');
?>

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.

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:

  • 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 :)

Mësim të mbarë.

4 Komente

25 Qershor 2010
Ora: 17:57:01

per leximin e permbajtjes se direktorive ne php 5 edhe versionet e metjeshme eshte funksioni scandir() qe e thjeshteson shume leximin e direktorive  (Përgjigju)

25 Qershor 2010
Ora: 23:24:36

Nga mesi i guides kam treguar perdorimin e funksionit scandir() dhe krahasimin midis tij dhe readdir().  (Përgjigju)

28 Qershor 2010
Ora: 10:47:49

guidat qe keni vendosur deri tani jane ineteresante, sepse jane guida qe nuk kane egzistuar me pare ne shqip.
A nuk do te ishte me mire qe keto guida te perdoreshin se bashku per realizimin e nje produkti praktik>
P.sh. si te realizojme nje sistem te thjeshte menaxhimi me php/mysql(jo domosdoshmerisht nje cms), ne kete rast keto guidat behen jo vetem interesante por edhe nje pike referimi per dike qe deshiron te mesoje php/mysql per qellime praktike, pra te kaloje nga teoria ne realizimin e nje produkti. Mendoj qe nje praktike e tille do tju sillte edhe nje vazhdimesi lexuesish te interesuar per te ndjekur vazhdimin e projektit, Gjithsesi urime, jeni nder te paktet qe publikoni guida kaq te detajuara edhe te mirepunuara ne shqip.  (Përgjigju)

28 Qershor 2010
Ora: 11:06:56

Te falenderoj per komentin dhe fjalet e mira.

Ajo qe ti sygjeron eshte me se e drejte, sepse meson te ndertosh nje sistem te plote qe mund te perdoret ne praktike. Ne kete e kemi planifikuar qe ne hapat e pare te faqes, duke nxjerre edhe guiden e pare me kete ide, ate te ndertimit te nje CMS-je me PHP dhe MySQL. Por ka disa probleme ne realizimin e shpeshte te ketyre guidave:

1) Koha qe guida te tilla konsumojne eshte shume e madhe, sepse duhet te ndertosh sistemin nga zero, ta dokumentosh e ne fund te shkruash guiden permbledhese.

2) Interesi i komunitetit eshte i vogel, sepse shume pak merren seriozisht me programim per web. Nga sondazhet qe kemi bere, pjesa e madhe jane te interesuar ndaj bazave.

Megjithate ne duam te mbajme te kenaqur cdo nivel perdoruesisht, qofshin fillestar apo te avancuar dhe ti japim arsye per tu kthyer ne kete faqe. Ato qe kam menduar qe ne fillim jane guida te plota per realizimin e sistemeve si: Blog, Galeri Fotosh, Sistem Komentesh, etj dhe eshte e sigurte qe ne nje te ardhme te afert do i realizoj.

Faleminderit.  (Përgjigju)

Jepni Mendimin Tuaj

* Emri, Emaili edhe Komenti janë të detyrueshme

Nëse doni të qëndroni gjithmonë të informuar rreth lajmeve që postohen në faqen tonë, pa pasur nevojë që të hyni përdit këtu, ne ju këshillojmë të abonoheni me E-mail.
Ne e urrejmë SPAM-in kështu që mund të regjistroheni pa problem. Ne ju premtojmë që do të merrni E-mail vetëm atëher kur të ketë postime të reja.

RSS Feeds E-Mail:

Shkruaj në Feniksi!

Ne paguajmë nëse ju shkruani një tutorial dhe publikohet tek faqja jonë.

Mëso më Shumë

MG ARTs WpAlb.com ShqipAD Webmaster.AL Host.AL Reklamo

Përkufizime Teknike

GPS: Global Positioning System është një teknikë gjurmimi e cila përdor satelitët. Marrësit GPS mund të përcaktojnë vendndodhjen e tyre me një saktësi deri në disa metra. Kjo teknikë përdoret gjërësisht nga navigatorët e makinave.

Quize

Ju jeni këtu: Faqja Kryesore » Manipulimi i Direktorive me PHP FillimShko në fillim

Info Info mbi Feniksi

Feniksi.Com është një faqe e cila përmban tutoriale të ndryshme mbi webdesign, programimi, grafik, këshilla mbi ndërtimin e faqeve e shumë gjëra të tjera. Për ne nuk është e thjeshtë ta shpjegojmë me disa fjalë, kështu që jua lejmë juve këtë gjë. Nëse keni ndonjë sugjerim për faqen apo ndonjë këshillë përmirësimi, ju lutem na kontaktoni.