PHP Directory Komutları

PHP nin kurulu olduğu bilgisayar veya scriptin çalıştığı serverda dosyalar veya dizinler üzerinde çeşitli işlemleri gerçekleştiren komutları vardır.Bunlardan dosyalar üzerinde işlem yapan(örn:dosya silme , dosya kopyalama,büyüklüğünü öğrenme,açma,kapama vb gibi) komutları PHP nin File System Function (Dosyasistemi fonksiyonları) içinde açıklanır.Diğer yandan Directory(Klasör) İşlemlerini ise burada açıklayacağımız fonksiyonlar gerçekleştirir.
PHP nin Klasör komutları şunlardır:
chdir()
dir()
closedir()
opendir()
readdir()
rewinddir()

Şimdi bu komutları yazacağımız bir programın içinde kullanarak öğrenelim.
Yazacağımız programda önce verilen bir klasörde bulunana dosya ve altklasörleri ekrana yazan bir program yazalım..

ÖRN-1:

<?php

$hedef=”c:/windows/desktop/ftp/klasör1″;

chdir($hedef);
$link=@opendir($hedef);
if(!$link){
echo “Belirtilen isimde bir klasör bulunamadı veya belirtilen yol yanlış!”;
}
while($dosya=readdir($link)){
if ($dosya != “.” && $dosya != “..”){
$tip=filetype($dosya);
echo $tip.” ”.$dosya ;
}
}
closedir($link);

?>


Şimdi bu kodları adım adım inceleyelim.

$hedef=”c:/windows/desktop/ftp/klasör1″;

Öncelikle $hedef değişkenine içeriğini listeleyeceğimiz klasörün adresini veriyoruz.Bu işlemi
C:/windows/desktop/ftp/klasör gibi kesin bir bildirim ile verebileceğimiz gibi bu dosyanın bulunduğu klasöre göre /klasör gibi göreceli bir adresde verebiliriz.

chdir($hedef);

bu satır ile php scriptine klasör değiştirmesini söylüyoruz.Burada dikkat edilmesi gereken bir nokta var.
Eğer biz chdir() komutunu kullanmazsak bu script yine verdiğimiz klasördeki içeriği listeleyecek.Ama bu defa içeriğim tipini yani dosya mı yoksa klasörmü olduğuna karar veren PHP nin Filesystem Function (Dosyasistem komutlarından) filetype() komutunu kullanamayacağız. Çünkü chdir() kullanmadan filetype() kullanırsak dönen değer fifo, char, dir, block, link, file ve unknown tiplerinden biri olacağına null yani boş değer olmaktadır.

Unutmadan ekleyelim,burada gelen içeriğin dosya mı yoksa klasör mü olduğunu bize söyleyen filetype()
Komutu yerine yine aynı işleve sahip is_dir(), is_file() , is_link() komutlarıda kullanılabilir.


$link=@opendir($hedef);

bu satır ile $hedef ile belirtilen klasörü açıp bağlantıyı $link değişkenine atıyoruz.Burada opendir() komutundan önce @ kullanmamızın sebebi hata durumunda yani belirtilen dosyanın açılamaması veya belirtilen isimde bir dosya bulunamaması halinde verilecek hata mesajını kontrol etmek ve kullanıcıya kendi hata mesajımızı iletmek.

if(!$link){
echo “Belirtilen isimde bir klasör bulunamadı veya belirtilen yol yanlış!”;
}

$link=@opendir($hedef); fonksiyonu yapılan işlem sonrası başarı halinde true hata halinde ise false değerini gönderir.yani $link değişkeni yada true değeri yada false değerine sahiptir.
If kontrol deyimi ile $link false ise yani opendir() fonksiyonu ile klasör açılamamışsa ekrana kendi hata mesajımızı yazdırıyoruz.



while($dosya=readdir($link)){
if ($dosya != “.” && $dosya != “..”){
$tip=filetype($dosya);
echo $tip.” ”.$dosya ;
}
}


yukarıdaki kod grubunda önce bir döngü kurduk ardından if ile bir kontrol oluşturduk.Bunlara geçmeden önce  yukarıda kullandığımız readdir() fonksiyonunu açıklayalım.
Evet readdir() fonksiyonu ile sizinde tahmin etmiş olduğunuz gibi opendir() fonksiyonu ile açılmış olan klasörden içerik okuyoruz. Burada while ile döngü kurmamızın sebebi readdir() fonksiyonu her çağrılışında belirtilen klasörün içinden bir dosya veya klasör adı okur.Bu durumu PHP nin mysql_komutlarından mysql_fetch_array() a benzetebiliriz.

If  kontrol deyimi kullanılarak dosya isimlerinin “.”  veya “..” olmaması sağlanır yani eğer dosya “.” veya “..”  ismi ile geliyorsa bunu ekrana basmıyoruz.Eğer if deyimini kaldırarak scripti çalıştırırsak ekrana yazılan dosya ve klasör isimleri arasında “.” ve “..” isimlerininde olduğunu görürüz.Bunun sebebini açıklamak isterdim ama ne yazıkki benimde bir fikrim yok.J

If koşulunun olumlu olamsı yani dosya isimlerinin “.” ve “..” dan farklı olması halinde
filetype() fonksiyonu ile bunu dosyamı yoksa klasör adımı olduğunu öğrenip bunu $tip değişkenine atıyoruz.Ve ardından önce tipini sonrada adını ekrana basıyoruz.

While döngüsü sona erdiği zaman yani klasör ün tüm içeriği okunduktan sonrada dongüyü bitiriyoruz.
Ve ardından programımızın son satırı :

closedir($link);

komutu ilede opendir() kullanarak açtığımız klasörü kapatıyoruz.Burada yine önemli bir noktaya dikkat etmemiz gerekiyor.
closedir() fonksiyonu ile daha önce açılmış bir klasörü kapatabilmemiz için bu klasörün mutlaka opendir() fonksiyonu ile açılmış olması gerekiyor.Şimdi siz içinizden klasörler başka bir komut ilede açılabiliyor mu? Diye geçiriyorsunuzdur.Hemen cevaplayalım:

Klasör açmak içindekileri ekrana basmak için ve onu kapatmak için yukarıdaki komutlardan farklı bir fonksiyonumuz aslında bir CLASS ımız var yani bir nesne.

dir()

bu nesne aslında tam olarak nesnede değil görünürde nesneye dayalı bir mekanizma sözkonusu bir klasörü okumak için..
dir($hedef);
satırı ile $hedef ile belirtilen klasör açılır.Bu klasörü dir() nesnesi ile açtığımız zaman okumak için readdir(), kapatmak içinde closedir() fonksiyonlarını kullanamıyoruz.İyi peki ama nasıl okuyup nasıl kapatacağız klasörü..

dir() fonksiyonu bir nesne olduğu için bu işlemleri yapan kendi methodları var..Bir örnekle açıklamaya çalışalım:


<?php

$hedef=”C:/windows/desktop/ftp/klasör1”;
$d = dir($hedef);

echo “Path: “.$d->path.”<br>\n”;

while($dosya=$d->read()) {
echo $dosya.”<br>\n”;
}

$d->close();

?>

Bo kodda $d=dir($hedef); yazarak $hedef klasörü üzerinde yapılacak açma,okuma ve kapatma işlemleri ni gerçekleştirecek olan dir() classının $d ye atadık.ve dir($hedef); diyerek klasörü açmış olduk.
dir() nesnesini iki özelliği vardır.Bunlar path ve handle dir.

Path özelliği klasörün adresini verir.
echo “path :”.$d->path; yazılarak bu nesnenin özelliğine erişilir.

while($dosya=$d->read()) {
echo $dosya.”<br>\n”;
}

yukarıdaki döngünün amacı ve nasıl işlediği yukarıda anlatımıştı.Burada sadece açıklanacak nokta
$dosya=$d->read();

satırıyla $d nesnesinin read() methoduna erişilir.ve dosya adı $dosya değişkenine aktarılır.

$d->close();

satırıylada bu nesnenin close methodu kullanılarak klasör kapatılır.Bu tip kapatma sadece dir() nesnesi ile açılan klasörlerde kullanılır.

Bu nesnenin birde rewind() methodu vardır.Bu method açılan klasör akımını yani bağlantıyı resetlemek için kullanılır.Görünürde bir faydası yok.(Ben saçmalamaya başladım.yahu su rewinddir() komutunun ne işe yaradığını tam olarak bilen biri buraya onu eklerse bende saçmalamayacağımJJJ)


Peki şimdi bu komutlarla ne yapabiliriz diye düşündük ve aklımıza şöyle birşey geldi.
Öyle bir script yazalımki sayfa her çağrılışında farklı bir resmi ekrana basılsın.(veya bir text dosyasının içinide ekrana basabiliriz.)

ÖRN-2:


<?php

$hedef=”c:/windows/desktop/ftp/klasör1″;
$i=0;

chdir($hedef);
$link=@opendir($hedef); //klasörü açıyoruz
if(!$link){echo “belirtilen yol yanlış veya dosya bulunamadı.”;}
while($dosya=readdir($link)){
if ($dosya != “.” && $dosya != “..”){
$tip=filetype($dosya);
if($tip==”file”){
$dosyadizi[$i++]=$dosya; //dosya isimlerini bir diziye atıyoruz.
}
}
}
closedir($link);

srand((double)microtime()*1000000);
$limit=sizeof($dosyadizi); //$dosyadizi dizsinin eleman sayısını öğreniyoruz.
$no = rand(0,$limit-1);   //0 ile $dosyadizi dizisinin eleman sayısının bir eksiği arasında rastgele sayı
//üretiyoruz.
echo “<img src=\”$hedef/$dosyadizi[$no]\” >”;

?>

1 Yorum var
  1. Tayfun ÇAKIR

    Çok güzel anlatımlarda bulunuyorsun ertan, burada php öğrenicez galiba=)

Cevap Gönder

E-posta adresiniz yorumunuzda yayınlanmayacaktır.