Visoka škola strukovnih studija za informacione i komunikacione tehnologije Beograd Upravljanje datotekama i direktorijumima dr Nenad Kojić
Datoteke Datoteka je uređena sekvenca bajtova smeštenih na disku, CD-ROM-u ili nekom drugom medijumu Direktorijum je poseban tip datoteke koji čuva imena drugih datoteka ili direktorijuma Direktorijum i datoteka se karakterišu svojom putanjom Putanje se različito zapisuju za Linux i Windows Za Unix sistema, kao što je Linux /home/moje/podaci/arhiva.txt Za Windows C:\moje\podaci/arhiva.txt PHP koji je instaliran na Windows-u će ispravno konvertovati oba tipa crta, ali je potrebno putanju pisati pod znacima navoda, da se \ ne bi tumačila kao escape
DATOTEKE Txt Nizovi!!! SQL
Upisivanje i čitanje podataka Upisivanje podataka podrazumeva tri koraka: 1. Otvaranje datoteke (Ako ne postoji treba je napraviti) 2. Upisivanje podataka u datoteku 3. Zatvaranje datoteke Čitanje podataka iz datoteke podrazumeva: 1. Otvaranje datoteke (Ako ne postoji- rešiti programski) 2. Čitanje podataka 3. Zatvaranje datoteke
Otvaranje datoteke 1 Za otvaranje datoteke (ili URLa) koristi se php funkcija fopen() Režimi rada sa datotekama: -Da li se otvara samo za čitanje, upis ili oba? -Da li se upisuje preko postojećeg sadržaja ili dodatak? -Šta ako je datoteka u upotrebi? r Otvara se datoteka za čitanje (r+čitanje i upis od početka) w - Otvara se datoteka za upis (w+čitanje i upis od početka) a - Otvara se datoteka sa nastavljanjem sadržaja (ako je nema pravi se) b Ide u kombinaciji sa drugim simbolima, i pravi razliku između binarnih i tekstualnih datoteka t - Ide u kombinaciji sa drugim simbolima, i pravi text tip datoteku.
Otvaranje datoteke 2 Datoteka treba da je van direktorijuma u kome se nalazi prezentacija iz sigurnosnih razloga Ukoliko datoteka ne postoji, PHP generiše grešku Da se ova greška ne bi videla piše se simbol @ @ $nasadatoteka=fopen( folder/spisak.txt, ab ); Treba proveriti da li je datoteka dostupna, i ako ne generisati neku poruku korisniku Ako funkcija fopen() ne uspe, vraća se vrednost false $nasadatoteka je identifikator i sadržaj datoteke @ $nasadatoteka=fopen( folder/spisak.txt, ab ); If (! $nasadatoteka) { echo Vaša poruđžbina nije prihvaćena. Molimo pokušajte ponovo! ; exit; }
Zatvaranje datoteke Datoteka se zatvara funkcijom fclose(), pri čemu je obavezan identifikator datoteke fclose($nasadatoteka); Za razliku od upisa, kod zatvaranja se mnogo retko dešavaju slučajevi da se funkcija ne realizuje, pa se obično ne proverava Zatvaranjem datoteka, funkcija fclose() vraća true, pa se uvek može proveriti kao $zatvaranje=fclose($nasadatoteka); If (! $zatvaranje) { echo Vaša porudžbina nije još uvek obrađena (snimljena). Molimo pokušajte ponovo! ; exit; }
Čitanje datoteke Jedna od mnogo funkcija za čitanje je fread(), koja čita više bajtova iz datoteke odjednom Primer: do{$jedan_karakter=fread($datoteka, 10); $brojac.= $jedan_karakter;} while ($jedan_karakter) Skoro na isti način radi i funkcija fgetc(): koja čita jedan po jedan znak iz datoteke, a kada dođe do kraja vraća False Primer: $jedan_karakter=fread($datoteka, 1); je isto što i $jedan_karakter=fgetc($datoteka)
fread() $nasadatoteka=fread( folder/spisak.txt, 15); Na ovaj način iz datoteke (spisak.txt) sa definisanom putanjom (folder/spisak.txt) čita se 15 bajtova i vraća kao string, smeštajući u promenljivu $nasadatoteka Kada se pročita prvih 15 bajtova, i ponovo pozove funkcija fread, ona automatski čita sledećih 15 bajtova, i tako redom Kada se dođe do kraja, i ostane manje od 15 bajtova, taj broj se pročita i vrati promenljivoj kao string
Čitanje datoteke 2 Funkcija fgets()čita skupove znakova. Za razliku od fgetc() koja čita jedan po jedan znak, fgets()čita grupu znakova u navedenoj dužini. Prestaje sa čitanjem nailaskom na novi red ili kraj datoteke Čitanje cele datoteke je sa funkcijom file() Čitanje cele datoteke sa ispisom je funkcijom fpassthru(), ili pomoću readfile()
Detektovanje kraja sadržaja feof() File End Of File Funkcija feof() vraća True kada dođe do kraja datoteke, a u suprotnom vraća False Sintaksa feof($datoteka) feof() se jančešće koriti u kombinaciji sa while, i tako ne mora da se zna broj karaktera ili zapisa u datoteci while (!feof($nasadatoteka))
Primer feof() @ $nasadatoteka=fopen( proba/spisak.txt, r ); If (!$nasadatoteka) { echo Nema novih podudžbina! ; exit; } else{ while (!feof($nasadatoteka)) { $spisak=fgets($nasadatoteka, 999); echo $spisak <br/> ; } fclose($nasadatoteka); } Čitanje grupe znakova Ispis svih elemenata podrazumeva prolaz petljom kroz svaki red datoteke, ili grupe znakova, i ispis istog.
Primer fread() <? $a="test.txt"; $b=@fopen($a,"r"); $tekst=""; while(!feof($b)) { $tekst.=fread($b,500); } fclose($b); print($tekst);?>
Učitavanje niza iz datoteke Kada se formira datoteka, podaci se automatski mogu prebaciti u niz da bi se parcijalno mogli obrađivati Prebacivanje datoteke u niz je funkcijom file() Funkcija file() celu datoteku učitava u jedan niz, a svaki element tog niza je pojedinačni red iz datoteke Funkcija count() vraća ukupan broj elemenata u nizu (broj redova u datoteci) $promenljiva = file( folder/spisak.txt ); //datoteka je u nizu na koji ukazuje $promenljiva $brojelemenata= count($promenljiva); for ( $i=0; $i< $brojelemenata; $i++) {echo $promenljiva[$i] ;}
Načini čitanja datoteke 1 Čitanje red po red, dok se ne dođe do kraja datoteke, ili se isčita 998 bajtova $spisak=fgets($nasadatoteka, 999); Čitanje uz rastavljanje na pojedinačna polja, u odnosu na mesta gde se nalaze graničnici (tabulatori) $spisak=fgetcsv($nasadatoteka, 100, \t ); Rezultati se smeštaju u niz $spisak, a 100 je dužina u karakterima i trebalo bi da bude duže od dužine najdužeg reda u datoteci Čitanje cele datoteke je funkcijom readfile() i prikazuje se direktno u web čitaču, funkcijom file(), kojom se sadržaj smešta u niz readfile ( folder/spisak.txt );
Načini čitanja datoteke 2 $nasadatoteka=fopen( folder/spisak.txt, rb ); fpassthru($nasadatoteka); Funkcija fpassthru čita sve fajlove od trenutne pozicije pa do kraja fajla i smešta u bafer <?php $file = fopen("test.txt","r"); // Čita prvi red fgets($file); // Ostatak redova čita i šalje u bafer echo fpassthru($file); fclose($file);?>
Upis u datoteku Upis se vrši funkcijom $nasadatoteka=fopen( spisak.txt",'ab'); fwrite($nasadatoteka, $tekst); Tekst iz promenljive $tekst upisuje se u datoteku na koju pokazuje $nasadatoteka Može se definisati broj karaktera (dužina) koja se upisuje fwrite($nasadatoteka, $tekst, strlen($tekst)); Delovi zapisa se moraju razdvojiti nekim simbolima, ako se smeštaju u isti red $tekst = $date. \t.$knjige. knjiga\t.$olovke. olovki\t.$gumice. gumica\t. $ukupnoartikala. \n ; t je simbol za tabulator
Primer - Pristup, čitanje, upis i prikaz podataka iz tekstualnog fajla <? $nas_fajl="test.txt"; $sadrzaj=@fopen($nas_fajl,"r"); $tekst=""; $dodatak = "Jos nesto!"; while(!feof($sadrzaj)) { $tekst.=fread($sadrzaj,500); } $tekst1 = $tekst1.$dodatak ; fwrite($sadrzaj, $tekst1 ); fclose($sadrzaj); print($tekst1);?>
Rad sa podacima Vrednosti koje su u datoteci unete kao text, a odnose se na brojne veličine, moraju se konvertovati (input type= text ) Konverzija znakovne u brojnu promenljivu je funkcijom intval() Da bi se svaki od elemenata niza rasčlanio na delove, koristi se funkcija explode() Kako su u datoteci podaci bili razdvojeni tabulatorom, format funkcije je explode( \t, $promenljiva[$i]); Nakon rastavljanja elementa niza na njegove delove, treba formirati novi niz čiji će elementi biti dobijeni delovi
Izdvajanje delova unutar elementa Početni niz [0] [1] [2] 3. \t. b. \t.c \t. d \t Novi niz 1 [0] [1] [2] [3] [4] [5] 3 b c d... $brojelemenata= count($promenljiva); for ( $i=0; $i< $brojelemenata; $i++) $novi = explode( \t, $promenljiva[$i]); $novi[0]=intval ($novi[0]); // $novi[0]=3 $novi[1] // $novi[1]=b Ako je bilo potrebe za konverzijom
Prekid rada die() Prekid rada se može uraditi i automatski ako je u toku nekog obaveznog koraka bila greška Za to se koristi funkcija die Najčešće je to u if uslovu u kombinaciji sa otvaranjem, pa ukoliko se desi problem, kod se prekida, i korisniku se prikazuje adekvatna greška Primer $counter=./count.dat ; If (!($datoteka=fopen($counter, r ))) die ( Problem sa otvaranjem datoteka, pokusajte ponovo! );
Kopiranje i menjanje imena Kopiranje (prva u druga) - copy() if(!copy (./prva.txt, druga.txt )) die ( Nije uspelo kopiranje datoteke prva.txt u druga.txt! ); Promena imena - rename() if(!rename (./prva.txt, druga.txt )) die ( Nije uspela promena imena prva.txt u druga.txt! );
Provera postojanja i brisanje Provera postojanja - file_exists() if(file_exists( folder/spisak.txt )) echo Porudžbina čeka na obradu! ; else echo Nema novih porudžbina! ; Brisanje datoteke - unlink() unlink ( folder/spisak.txt ) Funkcija unlink() vraća false ako se brisanje ne izvrši. Za razliku od većine drugih jezika ne postoji funkcija delete
Zaključavanje datoteka 1 Koristi se da bi se izbegli problemi paralelne obrade baze Funkcija za zaključavanje je flock() Funkcija vraća true ako se datoteka uspešno zaključa Vrednosti parametara funkcije flock(): LOCK_SH - Zaključano za čitanje (više korisnika deli datoteku) LOCK_EX - Zaključano za upis (više korisnika ne može da deli datoteku) LOCK_UN - Otključava zaključanu datoteku LOCK_NB - Sprečava blokiranje prilikom zaključavanja flock() ne radi sa FAT i NFS mrežnim sistemima
Zaključavanje datoteka 2 $nasadatoteka = fopen ( folder/spisak.txt, ab ); flock ( $nasadatoteka, LOCK_EX ); // zaključaj datoteku radi upisivanja fwrite ( $nasadatoteka, $text ) ; flock ( $nasadatoteka, LOCK_UN ) ; // otključaj datoteku fclose ( $nasadatoteka ) ; $nasadatoteka = fopen ( folder/spisak.txt, r ); flock ( $nasadatoteka, LOCK_SH ); // zaključaj datoteku radi čitanja fwrite ( $nasadatoteka, $text ) ; flock ( $nasadatoteka, LOCK_UN ) ; // otključaj datoteku fclose ( $nasadatoteka ) ;
Slanje mail-a u PHP-u U PHP-u se mail može slati direktno bez direktnog kontakta nekog od korisničkih programa, ali se pri instalaciji mora definisati o kom programu se radi Funkcija za slanje mail-a je mail() Kao argumenti funkcije obavezni su adresa, subject, i poruka dok su ostali opcioni Provera popunjenosti obaveznih polja može se izvršiti funkcijom isset() Argument funkcije je name polje, koje se kontroliše, i ako je popunjeno vraća se true if (isset($knjiga)) {echo Ovo polje je popunjeno ;}
Kod za slanje mail-a <? $ime=$_post['ime']; $adresa=$_post['adresa']; $tekst=$_post['tekst']; $adresaprimaoca='info@milence.com'; $subject='poruka sa sajta!'; $sadrzajmaila='pošiljalac: '.$ime. "\n".'e mail pošiljalaca: '.$adresa. "\n". "Komentar: \n".$tekst. "\n"; $dolaznisajt='from:milence.com'; mail($adresaprimaoca, $subject, $sadrzajmail, $dolaznisajt);?>
Svojstva u vezi sa vremenom Funkcija filetime() vraća poslednje vreme pristupa datoteci Funkcija filectime() vraća poslednje vreme menjanja datoteke (kreiranje, upis ili promenu dozvola) Funkcija filemtime() vraća poslednje vreme ažurirnja datoteke (kreiranja ili promene sadržaja) Funkcija getdate() vraća kompletan podatak o datumu i vremenu za neki događaj
Vlasništvo i dozvole Kao i na većini operativnih Unix sistema gde se mogu dobiti informacije o vlasništvu i dozvolama za rad nad datotekama, to je moguće uraditi i u PHP-u. Sve datoteke se mogu vezati za određenog korisnika ili grupu korisnika, sa pravima o čitanju, pisanju ili izvršavanju sadržaja u njima Postoje tri vrste dozvola koje se mogu koristiti: Vlasnik datoteke onaj koji ju je kreirao Grupa korisnika grupa kojoj korisnik pripada Svi korisnici svi sa nalogom na sistemu
Vlasništvo i dozvole Korisnici i grupe su identifikovani preko ID brojeva i preko imena Za informacije o korisniku preko njegovog ID-a, koristi se funkcija posix_getpwuid() koja vraća niz sa sledećim vrednostima
Vlasništvo i dozvole I funkcija posix_getgrgid() vraća niz da vrednostima Funkcija fileowner() vraća ID broj korisnika koji je vlasnik date datoteke Funkcija filegroup() vraća ID broj grupe kojoj pripada vlasnik date datoteke Funkcija filetype() vraća tip datoteke. Moguće vrednosti su fifo, char, dir, block, link, file i unknown Funkcija is_dir() vraća True ako je dato ime datoteke direktorijum Funkcija is_file() vraća True ako je dato ime datoteke obična datoteka
Upload file - 1 HTML forma <html> <body> <form action="upload_file.php" method="post" enctype="multipart/formdata"> Za fajlove Za binarne fajlove: Filename: datoteke <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="submit" /> </form> </body> </html>
Upload file 2 / upload_file.php PHP kod <?php niz $_FILES["file"]["name"] ime uploadovanog fajla $_FILES["file"]["type"] - tip uploadovanog fajla $_FILES["file"]["size"] veličina u bajtima uploadovanog fajla $_FILES["file"]["tmp_name"] - ime privremene kopije na serveru $_FILES["file"]["error"] greška nastala pri uploadovanju fajla if ($_FILES["file"]["error"] > 0) { echo "Error: ". $_FILES["file"]["error"]. "<br />"; } else { echo "Upload: ". $_FILES["file"]["name"]. "<br />"; echo "Type: ". $_FILES["file"]["type"]. "<br />"; echo "Size: ". ($_FILES["file"]["size"] / 1024). " Kb<br />"; echo "Stored in: ". $_FILES["file"]["tmp_name"]; }?>
Restrikcije kod upload-a Upload.gif ili.jpeg fajl veličina fajla do 20 kb <?php if ( ( ($_FILES["file"]["type"] == "image/gif") ($_FILES["file"]["type"] == "image/jpeg") ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Error: ". $_FILES["file"]["error"]. "<br />"; } else { echo "Upload: ". $_FILES["file"]["name"]. "<br />"; echo "Type: ". $_FILES["file"]["type"]. "<br />"; echo "Size: ". ($_FILES["file"]["size"] / 1024). " Kb<br />"; echo "Stored in: ". $_FILES["file"]["tmp_name"]; } } else { echo "Invalid file"; }?>
Dati kod kreira privremnu kopiju upload-ovanog fajla na serveru. Krajem skripta ova kopija nestaje, pa se vrši njeno kopiranje na drugu lokaciju. <?php if (($_FILES["file"]["type"] == "image/gif") ($_FILES["file"]["type"] == "image/jpeg") ($_FILES["file"]["type"] == "image/pjpeg") && ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: ". $_FILES["file"]["error"]. "<br />"; } else { echo "Upload: ". $_FILES["file"]["name"]. "<br />"; echo "Type: ". $_FILES["file"]["type"]. "<br />"; echo "Size: ". ($_FILES["file"]["size"] / 1024). " Kb<br />"; echo "Temp file: ". $_FILES["file"]["tmp_name"]. "<br />"; if (file_exists("upload/". $_FILES["file"]["name"])) { echo $_FILES["file"]["name"]. " already exists. "; } else { move_uploaded_file($_files["file"]["tmp_name"], "upload/".$_files["file"]["name"]); echo "Stored in: ". "upload/". $_FILES["file"]["name"]; } } } else { echo "Invalid file"; }?>
Toliko za sada
Otvaranje datoteke 3 ne važi za xampp Prvo se definiše putanja root-a samog servera u promenljivoj $DOCUMENT_ROOT $DOCUMENT_ROOT = $_SERVER[ DOCUMENT_ROOT ] (Kod simuliranja Root je npr C particija hard diska) Zatim se definiše promenljiva ($nasadatoteka) u koju se smeštaju podaci iz datoteke $nasadatoteka=fopen( $DOCUMENT_ROOT/ /folder/spisak.txt, ab ); Otvaranje datoteka pomoću FTP i HTTP protokola Smeštanje na udaljenom računaru definiše se protokolom, nakon čega se uspostavlja veza sa tim serverom automatski. Jedini uslov je crta na kraju adrese. Dobar primer http://www.primer.com/