PHP dilinin root'unuzda dosya oluşturma ve silme, dosyaya ekleme, yönlendirme gibi pekçok farklı yeteneği vardır.
Bu sayfada yüzeysel ve basitleştirilmiş olarak açıklanmış PHP hakkındaki konular PHP resmi sayfasında örneklerle birlikte çok daha ayrıntılı açıklanmıştır. Bazen ayrıntı iyidir, bazen de basitlik..
Her zaman olması gerektiği gibi hata almamak için PHP sayfasının başlangıç ve bitiş sembol etiketlerine ayrıca iterasyonun yani algoritma adımının sona erdiğini ifade eden noktalı virgüllere (;) dikkat ediyoruz. Betiklerimizde kontrol yapıları ve hatta hata yakalama yöntemlerini kullanmanın yüksek kalite getireceğini hatırlatalım. Dosya işlemlerine tabiki dosya oluşturarak başlayacağız..
Dosya oluşturmak için touch() yerleşik fonksiyonunu kullanıyoruz.
touch("birdosya.txt");
Bu şekilde yazılmış kodu tarayıcı ile çalıştırdığınızda 'mevcut dizin içerisinde' birdosya.txt isimli ve uzantılı dosyanız oluşturulacaktır. Bir geliştirici olarak sizin yolu ve yolun altını yada üstünü seçebileceğinizi varsayıyoruz. Yinede kısaca bir hatırlatalım root'ta mevcut dizinin üzerindeki dizine yol vermek için, dosya yolunun başına '../birdosya.txt' getirilerek bir üst dizine ulaşılır. Aşağı ulaşmak içinse dosya yolunun başına klasör adı girilir birklasor/birdosya.txt
Bakalım gerçekten dosya oluşturuldu mu? Bu kontrol file_exists() yerleşik fonksiyonu ile yapılıyor.
if (file_exists("birdosya.txt")){
echo "Dosyaya ulaşıldı. Dosya zaten mevcut";
} else{
echo "Dosyaya ulaşılamadı. Dosya mevcut değil.";
}
Peki dosya gerçekten dosyamıdır? Yoksa şu kuantum olaylarındaki gibi bir anlık yansımadanmı ibaretti? Bu kontrol is_file() yerleşik fonksiyonu ile yapılmaktadır.
if (is_file("birdosya.txt")) {
echo "Kontrol: Dosya dosyadır.";
} else{
echo "Uyarı: Dosya dosya değildir.";
};
Dosyanın okunaklı olup olmadığı kontrolü is_readable() yerleşik fonksiyonu ile yapılıyor.
if (is_readable("birdosya.txt")) {
echo "Kontrol: Dosya okunabilir.";
} else{
echo "Uyarı: Dosya okunamıyor.";
};
Dosyanın yazılabilir olup olmadığı kontrolü is_writable() yerleşik fonksiyonu ile yapılıyor.
if (is_writable("birdosya.txt")) {
echo "Kontrol: Dosya yazılabilir.";
} else{
echo "Uyarı: Dosya yazılamıyor.";
};
Yeni dosyamız şuan bomboştur. Hadi içerisine birşeyler yazalım. Algoritma şöyle olacak 1- Dosyayı açarak bağlan 2- Dosyadaki veriyi oku yada yaz 3- Dosyayı kapatarak bağlantıyı sonlandır.
touch("birdosya.txt");
$dosya = fopen("birdosya.txt", "r+");
fputs($dosya, "Geceler yar yar. \n");
fwrite($dosya, "Başımda sevdan..");
fclose($dosya);
Yukarıdaki kodlar içerisinde fputs() aynı işlevi gören fwrite() yerleşik fonksiyonunun lakabıdır. İki fonksiyonuda bunu açıklamak için kullandık. "\n" imleci alt satır başına geçiren kaçış dizisidir ve yalnızca çift tırnak içerisinde çalışır.
"r+" ile dosyayı hangi kipte açtığımızı belirttik.
Dosya içeriğini okuma işi için genellikle fread() ve ardından fgets() yada feof() fonksiyonlarından biri kullanılıyor. Bu sayede eklediğimiz şarkı sözlerini tarayıcımızla ekrana yazdırabileceğiz.
$mosya = fopen("birdosya.txt", "r");
echo fread($mosya, 1024);
fclose($mosya);
İşlem adımları yazmak ile aynı aç, oku/yazdır, kapat. Yöntemlerimizde değişkene atamak gibi kolaylıklar içeriyor. Burada dikkat edeceğimiz şey 1024'ün ne olduğudur. 1024 Byte = 1 KiloByte.. Burada dosyadan kaç byte veri okuyacağımızı belirtiyoruz.
Byte'lar çok ilginç varlıklardır. Bu yazıyı yazarken kullandığımız herbir harf genellikle 1 Byte olur abcde bitişik yazıldığında genellikle 5 Byte olur. Fakat okutacağımız dosyanın sonuna kadar Byte'ları tek tek saymanın hem mantıksız hemde bazen olanaksız olması gibi nedenlerle aşağıda kullanımı açıklanacak filesize() isimli fonksiyonu kullanmak daha akıllıcadır.
Açtığımız her bağlantıyı mutlaka fclose() yerleşik fonksiyonu ile kapatıyoruz.
feof() fonksiyonu döngü ile birlikte kullanıldığında dosya boyutu ne olursa olsun dosyayı sonuna kadar okuyabilir.
$dosya1 = fopen("birdosya.txt", "r");
echo "Birinci yöntem";
while(!feof($dosya1)) {
echo fread($dosya1, 1024);
}
fclose($dosya1);
fgets() fonksiyonu dosyayı satır satır sonuna kadar okuyabilir..
$dosya2 = fopen("birdosya.txt", "r");
echo "İkinci yöntem";
while(!feof($dosya2)) {
echo fgets($dosya2);
}
fclose($dosya2);
fpassthru() fonksiyonu ile döngüye gerek kalmaksızın dosyayı okuyabiliriz. Yalnızca dosyayı açıp bağlanarak oluşturduğumuz değişkeni yazıyoruz ve işlem tamamlandığında kapatıyoruz..
$dosya3 = fopen("birdosya.txt", "r");
fpassthru($dosya3);
fclose($dosya3);
readfile() fonksiyonu dosya okumak için en kestirme yöntemdir ne döngüye ne de açma kapamaya ihtiyacımız yok..
readfile("birdosya.txt");
filesize() fonksiyonu dosya boyutunu bulmak için aşağıdaki gibi kullanılır. Gelen cevap Byte cinsindendir. 1 Byte 8 bittir (yani 1 yada 0'dan oluşan bit isimli varlık) kadardır. 1024 Byte 1 KiloByte eder bu demektirki sonucu KiloByte cinsinden istiyorsanız atadığınız değişkeni 1024'e bölerek yankılatmalısınız..
$boyut = filesize("birdosya.txt");
echo $boyut;
Ayrıca gelen sonuç tam sayıdır. (integer) Bunun sağlamasını değişken türleri hakkında bilgi veren gettype() fonksiyonu ile yapabilirsiniz. Bu önemlidir çünkü filesize() komutu çıktısıyla aşağıdaki gibi bir aritmetik işlem yapabilirsiniz. Aşağıdaki gibi bir kod, dosyaları okurken yada ekleme yaparken onlara şekil vermenizde çok işe yarayabilir.
$mosya = fopen("birdosya.txt", "r");
echo fread($mosya, filesize("birdosya.txt")-280);
fclose($mosya);
fseek() fonksiyonu imlecin dosya içerisinde istenilen konuma getirilmesini sağlar. İkinci parametresi yine Byte cinsindendir ve aşağıdaki gibi kullanılır..
$dosya = fopen("birdosya.txt", "r+");
fseek($dosya, filesize("birdosya.txt")-55);
fwrite($dosya, "Merhaba ben Barak..");
fclose($dosya);
Dosyayı ekleme modunda açtık, fseek() ile "SONDAN" 55.nci Byte'a imleci getirerek bu noktanın ardından fwrite() ile eklememizi yaptık.
fileatime() fonksiyonu dosyaya en son ne zaman erişildiğini gösterir. Sonucu 10 haneli bir sayı olarak döndürür.
echo fileatime("birdosya.txt");
Bu sayı aslında saniyeleri ifade eden bir timestamp yani zaman puludur. Zaman pullarını okunaklı hale getirmek için date() fonksiyonunu kullanırız.
echo date("d M Y H:i:s", fileatime("birdosya.txt"));
filectime() fonksiyonu dosyanın en son ne zaman değiştirildiğini gösterir. Sonucu yine 10 haneli bir zaman pulu sayısı olarak döndürür.
echo date("d M Y H:i:s", filectime("birdosya.txt"));
filemtime() fonksiyonu dosyanın en son ne zaman düzenlendiğini gösterir. Sonucu yine 10 haneli bir zaman pulu sayısı olarak döndürür.
echo date("d M Y H:i:s", filemtime("birdosya.txt"));
filetype() fonksiyonu varlığın dosyamı klasörmü olduğunu gösterir. Çıktısı file veya dir olarak iki sonuç verir.
echo filetype("birdosya.txt");
echo filetype("birklasor");
Dosya kopyalama işi copy() fonksiyonu ile yapılır. DİKKAT Eğer hedef klasörde aynı isimli bir dosya varsa o silinir ve yenisi kopyalanır. Aynı klasör içine de kopyalama yapılabilir.
copy("birdosya.txt", "birklasor/birdosya.txt");
Yukarıda görüldüğü gibi önce kaynağı, virgülün ardından ise hedefi str olarak belirtiyoruz. Kod tarayıcıda çalıştırıldığında izinler ile ilgili kısıtlama yoksa kopyalama işlemi tamamlanır. Kopyalama upload işlemlerinde sıklıkla kullanılır.
glob() fonksiyonu klasörde yer alan dosya ve dizinleri listelemektedir. Bu fonksiyonun çıktısı dizi şeklindedir.
glob("*.*");
glob("*.html");
Yukarıdaki ilk kod çalışılan klasördeki tüm dosyaları listeler. İkinci kod ise yalnızca hmtl uzantılı dosyaları listeler. glob() çıktısı dizi değişken (array) olduğundan foreach kullanarak aşağıdaki gibi düzenli ve kolayca kullanabiliriz.
$dosyalar = glob("*.*");
print_r($dosyalar);
foreach($dosyalar as $liste) {
echo $liste . "< br>";
}
NOT: Dizinleri de görüntülemek için fonksiyonu glob("*") şeklinde kullanmalısınız.
rename() fonksiyonu dosyanın ismini yeniden adlandırmaya yarar. Kullanımı kaynak isim virgül hedef isim şeklindedir:
rename("birdosya.txt", "yenibirdosya.txt");