PHP Klasör Listeleme

Dosya işlemleriyle ilgili uygulama geliştirirken klasör listeleme veya klasör içindeki dosyaları listeleme işlemini sıklıkla kullanırız.

PHP klasör içeriğini listeleme için çeşitli hazır fonksiyonları barındırır.

Bunlardan en pratiği glob fonksiyonudur.

glob fonksiyonu

Fonksiyon parametre olarak bir klasör/dizin yolu veya bir kalıp alarak çalışır.

Kalıp alarak çalıştırıldığında sadece kalıba uyan dosyaları listeler.

<?php

$dosyalar = glob("*");

foreach ($dosyalar as $dosya) {

  echo $dosya . "<br />";

}

?>

Örnekte kodun yazıldığı klasördeki tüm dosya ve klasörler listelenecektir.

Klasör içerisindeki dosyaları listelemek için parametreye

$dosyalar = glob("*.*");

yazmak yeterli olacaktır.

Metin dosyalarını veya diğer özel dosyları listelemek için parametreye

$dosyalar = glob("*.txt");

örnekteki gibi dosya uzantısını yazmak yeterli olacaktır.

Farklı bir klasör içerisindeki dosya ve klasörleri listelemek için

$dosyalar = glob("D:\*");

klasör yolu ve kalıbın yazılması yeterli olacaktır.

İsteğinize göre dosyaları listelemek için farklı kalıpları deneyerek bulabilirsiniz.

Diğer pratik yöntem ise scandir fonksiyonudur.

scandir fonksiyonu

Fonksiyon parametre olarak bir klasör/dizin yolu alır ve içerisindeki dosya ve klasörleri listeler.

<?php

$dosyalar = scandir(".");

foreach ($dosyalar as $dosya) {

  echo $dosya . "<br />";

}

?>

Mevcut klasör içeriğini listelemek için nokta (.) değeri kullanılır.

Ancak fonksiyon klasör/dizin içeriğini listelerken istenmeyen mevcut dizin (.) ve üst dizin (..) değerlerini de listeler.

Bu değerlerin ve bazı özel dosyaların listelenmesini engellemek için çeşitli koşullar eklenebilir.

<?php

$dosyalar = scandir(".");

foreach ($dosyalar as $dosya) {

  if ($dosya =='.' || $dosya == '..' || $dosya == 'istenmeyendosya.txt') continue;

  echo $dosya . "< br / >";
    
}

?>

Sadece klasörlerin/dizinlerin listelenmesi için koşulun

if ($dosya =='.' || $dosya == '..' || $dosya == 'istenmeyendosya.txt' || is_file($dosya) ) continue;

olması yeterli olacaktır.

Dosyaların listelenmesi için koşula sadece

if (is_dir($dosya) ) continue;

olması yeterli olacaktır.

Diğer klasör/dizin ve dosya listeleme koşullarını (dosya boyutu 1mb az olan gibi) isteğe göre yazarak listeleme işlemi gerçekleştirilebilir.

Diğer yöntem ise en eski yöntem olan opendir, readdir, closedir fonksiyonlarıdır.

Bu fonksiyonlar temel olarak akım (stream) yöntemi ile çalışır.

opendir fonksiyonu

Fonksiyon bir klasörü/dizini açar ve akım olarak belleğe yükler.

readdir fonksiyonu

Fonksiyon opendir fonksiyonu ile belleğe yüklenen klasör/dizin içerisindeki dosyaları okur.

closedir fonksiyonu

Fonksiyon opendir fonksiyonu ile belleğe yüklenen klasörü/dizini siler/kapatır.

<?php

$dosyalar = opendir(".");

while($dosya = readdir($dosyalar)){

   echo $dosya . "<br />";

}

closedir($dosyalar);

?>

Bu yöntemde de scandir fonksiyonunda olduğu gibi koşul eklenmesi gerekebilir.

<?php

$dosyalar = opendir(".");

while($dosya = readdir($dosyalar)){

  if ($dosya =='.' || $dosya == '..' || $dosya == 'istenmeyendosya.txt') continue;

   echo $dosya . "<br />";

}

closedir($dosyalar);

?>

PHP ile bir klasördeki dosya sayısını almak için ayrıca çeşitli eklemeler yapılabilir.

<?php

$dosyaSayisi = 0;

$dosyalar = opendir(".");

while($dosya = readdir($dosyalar)){

  if (is_file($dosya)) $dosyaSayisi++;

  if ($dosya =='.' || $dosya == '..' || $dosya == 'istenmeyendosya.txt') continue;

   echo $dosya . "<br />";

}

closedir($dosyalar);

echo "Toplam dosya sayısı : " . $dosyaSayisi;

?>

Klasör sayısı için is_dir fonksiyonu kullanılabilir.

PHP ile klasör içerisindeki tüm dosya ve klasör içeriğini listelemek için aşağıdaki kendini tekrar eden (recursive) fonksiyon kullanılabilir.

<?php

function listele($yol = '.'){

  $tumDosyalar = [];

  $dosyalar = scandir($yol);

  foreach ($dosyalar as $dosya) {
    
    if ($dosya == '.' || $dosya == '..' ) continue;

    $tumDosyalar[] = $dosya;

    if(is_dir($yol . DIRECTORY_SEPARATOR . $dosya)) $tumDosyalar[$dosya] = listele($yol . DIRECTORY_SEPARATOR  . $dosya);

  }
  return $tumDosyalar;
}

print_r(listele('..'));

?>

Fazla klasör ve dosyanın olması komutun uzun süre çalışmasına neden olabilir.

Görüldüğü gibi PHP ile bir işlem birden fazla yöntem ile yapılabilir.

PHP Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!