25 Ocak 2012 Çarşamba

PHP Dosya ve Dizin İşlemleri


Butun bilgisayar programcilari yeri geldiginde dosyalarla ugrasmak zorunda kalir.Bu bazen gecici verileri dosyalarda saklama isteginden , uygulamanin setup bilgilerini saklamaya kadar genis bir yelpazede yer alir.


"Dosya" aslinda hardisk,floopy,cdrom gibi medyalarda saklanan sirali bytelardan baska bir sey degildir."Dizin" ise ozel bir dosya tipidir ve icinde diger dosyalarin ve dizinlerin isimleri saklanabilir.


Linux ve Windows


Unix tabanli isletim sistemleri(Linux gibi) dosyalara ulasmak icin tanimlanan "yol"larda,"/" isaretini kullanirken windows isletim sistemleri "\" ters slash tabir edilen isareti kullanmaktadir.


Unix icin dosya yolu ornegi,


/home/serkan/www/turkphp


Windows icin dosya yolu ornegi,


C:\belgelerim\www\turkphp\serkan


Bu olayin yazdigimiz kodlarda problem yaratacagini dusunebiliriz.Ancak windows uzerinde calisan PHP bu tip durumlarda kodlari otomatik olarak cevirerek kendi kullanabilcegi hale getirmektedir.Mesela ,


$fp = fopen ("/data/data.txt","r");


seklinde yazilan bir kod windows altinda da sorunsuz caliscaktir.Cok spesifik olmayan durumlar icin bu kural gecerlidir ve basinizi pek agritmaz.Yazinin ilerleyen kisimlarinda bir kac aciklama bu konu icin yapilacaktir.


Dosyalarla Calismak


Tipik olarak dosyalarla calisirken asagidaki adimlar izlenir.



  • Calismak istediginiz dosyayi yolu ile belirterek acin.
  • Dosyayi okuyun , dosyaya yazin vb...
  • Dosyayi kapatin.

    fopen ()


    Ilk gorecegimiz dosya fonksiyonu fopen (),dosyalari acmak icin kullanilir.Alabileegi 3 tane argument vardir :



  • dosyaadi
  • mode
  • use_include_path (opsiyonel olarak kullanabilirsiniz)

    Dosyalari acmak icin kullanilan bu fonksiyon ayni zamanda dosyalarin acilip acilamayacagini (yani izinleriniz tamam,dosya yerinde mi? gibi) kontrol icinde kullanilabilir.


    Ornek vermek istersek,


    $fp = fopen ("./data.txt","r");
    if (!$fp) die ("Dosya Acilamiyor");


    veya alternetif olarak tek satirda yazmak istersek,


    if (!($fp = fopen ("./data.txt","r"))) die ("Dosya Acilamiyor");


    Burada lutfen kafaniz karismasin.$fp degiskenine dosyanin yolunu veya fopen fonksiyonu kullanmamizin sonucundaki degeri esitlemiyoruz.Eger boyle yapmak isteseydik "==" kulllanirdik.Dikkat ederseniz burada bir test islemi gerceklesiyor.Yani aslinda biz belkide daha sonra kullanacagimiz bir dosyanin yerinde olup olmadigina bakiyoruz.Onun icin fopen fonksiyonu kullanarak dosyayi acmak istiyoruz.Donen degere gore if yapisi ile test islemini gerceklestiriyoruz.


    Bu komut kullanilarak yapilan yukaridaki gibi testlerde uzak host'lardaki dosyalarda kontrol edilebilir.Ornek vermek istersek,


    if (!($fp = fopen("http://www.turk-php.com/dosya.html","r"))) die ("Dosya Acilamiyor);


    if (!($fp = fopen("ftp://ftp.turk-php.com/dosya.html","r"))) die ("Dosya Acilamiyor);


    uzak host 'taki dosya "yanlizca okunabilir" olarak acilabilir.


    Eger daha once Unix tabanli bir isletim sistemi kulllandyisaniz bundan sonra yazacaklarimiza zaten asinasinizdir.Biz yine de bilmeyen insanlar icin bir tekrar yapmak istiyoruz.Cogu zaman gordugunuz ../data.txt veya ./data.txt gibi ifadeler ne anlama geliyor veya bu noktalar neden koyuluyor gibi?


    ./data.txt : scriptimiz ile ayni klasorde yer alan data.txt isimli dosya.
    ../data.txt : scriptimizin yer aldigi klasorun bir ustundeki klasorde data.txt isimli dosya.
    ../../../data.txt : scriptimizin yer aldigi klasorden uc level yukaridaki klasorde data.txt isimli dosya.


    Olayi anladiniz herhalde daha fazla ornek vermeye gerek duymuyorum.


    Simdi de dosyalari acarken kullandigimiz "mode" argumentine bakalim.


    r: Dosyayi yanliz okunabilir olarak ac.Kursor dosyanin basinda yer alir.
    r+: Dosyayi okunabilir ve yazilabilir olarak ac.Kursor dosyanin basinda yer alir.
    w: Dosyayi yanliz yazilabilir olarak ac.Kursor dosyanin basinda yer alir.Daha onceden var olan hersey yok olur.Eger boyle bir dosya yoksa PHP yaratmaya calisir.
    w+: Dosyayi okunabilir ve yazilabilir olarak ac.Kursor dosyanin basinda yer alir.Eger boyle bir dosya yoksa PHP yaratmak icin tessebuste bulunur.Dosya icinde daha onceden var olan hersey yok olur.
    a : Yanlizca dosyanin sonuna veri eklemek icin dosya acilir.Eger boyle bir dosya yoksa PHP yaratmaya calisir.Eklenen veriler dosyanin sonuna yazilir.
    a+ : Dosyanin sonuna veri eklemek ve dosya okunmak icin acilir.Eger boyle bir dosya yoksa PHP yaratmaya calisir.Eklenen veriler dosyanin sonuna yazilir.


    Mode argumenti ayni zamanda "b" degerini de almaktadir.Bu deger verildiginde dosya "binary" modunda islenir.Windows icin kullanislidir.Linux icin bu degerin bir anlami yoktur.


    "include_path" argumenti eger buyuk bir site uzerinde calisiyorsaniz ve "inc" dosyalari belirli bir klasor uzerindeyse php.ini dosyasinda "include_path" yolunu belirterek dosya acma islemlerinde bir kolaylik saglayabilirsiniz.ornek vermek istersek,


    php.ini dosyasinda "include_path" olarak /home/apache/inc verdiyseniz ve,


    fopen ("data.txt","r",1);


    yadiginiz zaman once data.txt dosyasi scriptin bulundugu klasorde aranacak eger bulunamaz ise /home/apache/inc klasorune bakilacaktir.


    fclose


    Dosya ile calismayi bitirdiginizde ,dosyanin kapatilmasi gereklidir.Bu islemi fclose () komutu ile yapabilirsiniz.Script calismayi bitirdiginde otomaik olarak butun acik dosyalar PHP tarafindan kapatilir.Size tavsiyemiz dosya ile calismayi bitirdiginiz anda bu komutu kullanarak dosyayi kaptmaniz.anck bu sekilde ayni scripti kullanan diger kullanicilar hizli bir sekilde servis alabilir.


    fclose ($fp);


    seklinde kullanilir.


    Dosyalardan okumak ve dosyalara yazmak


    Smdiye kadar dosya acma ve kapama islemlerini gorduk.Artik onlarin icinden verileri okuyabilir ve yazabiliriz.Ilk olarak cok basit iki komutu gorecegiz.Cogu islemde bu iki komut isinizi gorecektir.


    fread ()




    Bu komut dosyadan string karakterleri okumak icin kullanilir.Alabilcegi iki argument vardir.Ilki dosyanin ne oldugu,ikincisi integer yani sayisal olarak "length"(uzunluk) degeri.Ornek vermek gerekirse,


    $fp = fopen ("data.txt","r") ile dosyayi basarili sekilde actigimizi varsayalim.


    $data = fread($fp,10);


    burada $data degiskeni icine,actigim "data.txt" dosyasindan ilk 10 byte veriyi okuyup atamis oldum.


    Bu konu ile ilgili bilmeniz gereken bir kac onemli nokta bulunmaktadir.



  • Ilk 10 byte veriyi okuduk ve ayni islemi tekrar etmek istedik.Artik kursor ilk 10 byte'in bittigi yerdedir ve biz artik 10-20 bytelari arasindaki veriyi okuyabiliriz.
  • Eger dosya 10 byte'tan kucukse PHP dosyanin basindan sonuna kadar okur ve degeri dondurur,bir problem olmaz.

    fwrite ()


    Bu komut dosyaya veri yazmak icin kullanilir.Iki argument bu komutun kullanilmasi icin gereklidir .Birincisi dosyanin ne oldugu,ikincisi ise dosyanin icine ne yazilacagi. Eger islem basarili olursa degisken icin ,kac byte veri yazilmissa onun sayisal degeri doner,basarisiz olursa "-1".Ornek verecek olursak,


    $fp = fopen ("data.txt","w") ile dosyayi basarili sekilde actigimizi varsayalim.


    fwrite ($fp,"ABCDSerKanCeyLAnI");


    Bu komut "data.txt" dosyasinin basina "ABCDSerKanCeyLAnI" karekterlerini yazar.Daha onceden dosya icerisinde yazilmis tum veriler tamamen silinir.Yanlizca elinizde bu karaketerlerin yazili oldugu bir dosya kalir.Tekrar ediyoruz kursor bu karekter dizisinin sonuna gidip bekler.Bu komutu kullanirken aklinizda olsun, bilgisyara normal olarak klavyeden yaziliyor gibi karekterler yazilir ve kursor yazdiginiz yazi grubunun sonuna gidip bekler.


    Eger ozel bir uzunluk belirtmek isteseydik,bunu ucuncu argument olarak komuta su sekilde ekleyebilirdik,
    fwrite ($fp,"ABCDSerKanCeyLAnI",4);


    Bu komutla verdigimiz string ifadenin(ki bu "ABCDSerKanCeyLAnI" dir.) ilk 4 byte'i (ki bu "ABCD" dir.) $fp degiskeni ile belirttigimiz dosya icerisine yazilacaktir.Eger belirtilen uzunluk byte'i yazilacak ifadeden buyukse ifade'nin hepsi yazilir,bir problem olmaz.


    Artik bu kadar konusma yeterli uygulama yapmanin zamani geldi.




    Basit Bir Hit Sayaci


    <?php
    //hit_sayac1.php


    $sayac_dosyasi = "./sayac.dat";


    if (!($fp = fopen ($sayac_dosyasi,"r"))) die ("Dosya Acilamiyor");


    $sayac = (int) fread($fp,20);


    fclose ($fp)


    $sayac++;


    echo "Ziyaret Sayisi : $sayac";


    $fp = fopen ($sayac_dosyasi,"w");


    fwrite ($fp,$sayac);


    fclose ($fp);


    ?>


    Ne zaman sayfayi refresh yapsaniz sayfanin uzerindeki sayacin bir arttigini gorursunuz.


    Not : Bu kucuk programda "sayac.dat" isimli dosyanin zaten klasorun icinde oldugu kabul edilmektedir.Eger boyle bir dosya bulunamaz ise program hata verecektir.Bu nedenle Unix/Linux kullanicilari "touch" komutunu kullanarak dizin icinde bir dosya yaratbilirler.


    bash 2.0.4>touch sayac.dat


    veya bir text dosyasi acip "save as" ile bos olarak kaydedin.Kaydederken de "sayac.dat" ismini verin isiniz gorulur.


    Program nasil calisiyor?


    Ilk once "sayac.dat" dosyamiz scriptin bulundugu klasor icinde bulundu ve "yanlizca okunabilir" olarak acildi.


    $sayac_dosyasi = "./sayac.dat";


    if (!($fp = fopen ($sayac_dosyasi,"r"))) die ("Dosya Acilamiyor");




    ikinci satirda "if" komutuyla dosyanin acilmasi sirasinda bir problem oldu mu diye test yapiyoruz.Eger islem basarili olarak gerceklesirse parantezin disina "dogru" olarak cikacaktir.Ama dikkat ederseniz bir unlem isaretimiz var.Bu unlem isareti o "dogru" ifadasini "yanlis" a cevirecek ve boylece program bir alt taki satiri okuyacaktir.Her turlu problemde script "die" komutuyla , "echo" ile verigimiz ifadeyi ekrana basarak sonlanacaktir.




    Boylece yazi dizimizin ilk bolumunu bitirdik.Bundan sonraki bolumde ayrintili olarak "Dosya ve dizin Islemleri" konusuna devam edecegiz.


  • Hiç yorum yok:

    Yorum Gönder