İçeriğe geç

PHP Dizin ve Alt Dizinleri Listeleme

Herhangi bir dizindeki dosyaları veya alt dizinleri listelemek isteyebilirsiniz. Hatta alt dizinlerin altındaki dosya veya dizinleri de listelemek isteyebilirsiniz. Biz buna kısaca; bir dizinin içeriğinin çıkarılması diyelim, en iyisi. PHP ile bu mümkün.

Dizin ve alt dizinleri listeleme işlemini bir kaç farklı yolla yapabilirsiniz. En bilinen yöntem olan scandir() ile yapabilirsiniz. scandir() metodu ile bu işlemi gerçekleştirmeye kalktığınızda, sadece belirtilen dizin altındaki dizin veya dosyaları verir. Alt dizinlerdeki dosya ve dizinlerin listesini vermez. Bunun için de scandir() ile gelen sonucu; is_dir() ile kontrol edip, dizinse o dizin için tekrar scandir() metodunu kullanabilirsiniz. Bu oldukça meşakkatli bir işlem olacaktır. Bunun yerine size; recursive yöntemini önerebilirim.

RecursiveDirectoryIterator class (sınıf)’ı ile herhangi bir dizin içerisindeki tüm alt dizin ve dosyaların listesini elde etmeniz çok kolay.

Bu işlem için aşağıdaki gibi bir dosya yapısı hazırladım.

Example
  |- A
  |-- A1
  |-- A2
  |---- A21
  |---- A22
  |------ a22-data.txt
  |- B
  |---- b-data.txt
  |- C
  |-- C1
  |-- C2
  |---- c2-data.txt

Yukarıdaki şemada da görüldüğü üzere; oldukça karışık bir dizin yapısı mevcut.

Recursive bir şekilde bu alt dizinleri ve dosyaları da aşağıdaki şekilde alabilirim.

$path = realpath('./Example'); 
$directoryIterator = new RecursiveDirectoryIterator($path); 
$recursiveIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST); 

foreach($recursiveIterator as $iterator){ 
    echo($iterator . '<br>');
}

Yukarıdaki kodlarımızın ekran çıktısı da aşağıdaki gibi olacaktır.

C:\xampp\htdocs\Example\.
C:\xampp\htdocs\Example\..
C:\xampp\htdocs\Example\A
C:\xampp\htdocs\Example\A\.
C:\xampp\htdocs\Example\A\..
C:\xampp\htdocs\Example\A\A1
C:\xampp\htdocs\Example\A\A1\.
C:\xampp\htdocs\Example\A\A1\..
C:\xampp\htdocs\Example\A\A2
C:\xampp\htdocs\Example\A\A2\.
C:\xampp\htdocs\Example\A\A2\..
C:\xampp\htdocs\Example\A\A2\A21
C:\xampp\htdocs\Example\A\A2\A21\.
C:\xampp\htdocs\Example\A\A2\A21\..
C:\xampp\htdocs\Example\A\A2\A22
C:\xampp\htdocs\Example\A\A2\A22\.
C:\xampp\htdocs\Example\A\A2\A22\..
C:\xampp\htdocs\Example\A\A2\A22\a22-data.txt
C:\xampp\htdocs\Example\A\A3
C:\xampp\htdocs\Example\A\A3\.
C:\xampp\htdocs\Example\A\A3\..
C:\xampp\htdocs\Example\B
C:\xampp\htdocs\Example\B\.
C:\xampp\htdocs\Example\B\..
C:\xampp\htdocs\Example\B\b-data.txt
C:\xampp\htdocs\Example\C
C:\xampp\htdocs\Example\C\.
C:\xampp\htdocs\Example\C\..
C:\xampp\htdocs\Example\C\C1
C:\xampp\htdocs\Example\C\C1\.
C:\xampp\htdocs\Example\C\C1\..
C:\xampp\htdocs\Example\C\C2
C:\xampp\htdocs\Example\C\C2\.
C:\xampp\htdocs\Example\C\C2\..
C:\xampp\htdocs\Example\C\C2\c2-data.txt

Görüldüğü gibi çok basit bir şekilde; dizinleri ve alt dizinleri listeleme işlemini gerçekleştirdik.

Şimdi kodlarımıza dönelim ve neler yaptığımıza bir bakalım.

$path = realpath('./Example');

realpath () metodu, dizin yapılarında kullanılan; /, ./ ve ../ gibi sembolleri temizler ve dizin sonuna / işaretini ekler. Burada da Example dizini için bu işlemi gerçekleştirdik. Çünkü bu dizin altındaki alt dizin ve dosyaları alma işlemini gerçekleştireceğiz.

$directoryIterator = new RecursiveDirectoryIterator($path);

RecursiveDirectoryIterator class’ından bahsetmiştik. Bu class, belirtilen dizin üzerinde recursive (yinelemeli) işlem yapılmasını sağlar. Bir nevi tüm olası sonuçların elde edilmesi gibi düşünebilirsiniz. $path değişkenimiz üzerinde işlem yapacağımızı belirttik. Yani; ./Example dizini.

$recursiveIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);

RecursiveIteratorIterator class’ı ise; belirtilen yinelemeli yapı üzerinde adım adım gezilmesini sağlar. RecursiveDirectoryIterator ile belirttiğimiz dizinin alt dizin ve dosyalarını bu class yardımıyla tek tek gezeceğiz. RecursiveIteratorIterator::SELF_FIRST sabiti ise; hangi dizinleri listelemeye başlayacağımızı belirtir. Biz burada; tüm dizinleri listelemek istediğimiz için SELF_FIRST sabitini yazdık. Alt dizinleri öncelikli olarak listelemeye başlamak isteseydik: CHILD_FIRST sabitini yazmamız gerekirdi.

Dikkat ederseniz; buradaki kullandığımız class’ların hepsi constructor ile işlem gerçekleştirmektedir. Herhangi bir metot yazmadık.

Son yaptığımız işlem de bu dizinleri sırayla ekrana yazdırmak oldu.

Alt dizin ve dosyaları listeledikten sonra; bu dizinler içerisinde çeşitli işlemler gerçekleştirebiliriz. Örneğin; .txt dosyalarını silmek gibi. Bunun için de aşağıdaki kod işimizi görecektir.

if (is_file($item)) { 
    (pathinfo($item, PATHINFO_EXTENSION) === 'txt') ? unlink($item) : false; 
}

Yani kodlarımızın tamamı aşağıdaki gibi olacaktır.

<?php

$path = realpath('./Example'); 
$directoryIterator = new RecursiveDirectoryIterator($path); 
$recursiveIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST); 

foreach($recursiveIterator as $iterator){ 
    if (is_file($iterator)) { 
        (pathinfo($iterator, PATHINFO_EXTENSION) === 'txt') ? unlink($iterator) : false; 
    }
}

Burada; ben basit olarak, .txt uzantısına sahip olan dosya olup olmadığını kontrol etmek için pathinfo () metodunu kullandım. Bunun yerine regex de kullanabilirsiniz.

Son alarak tekrar ekran çıktımızı alalım.

C:\xampp\htdocs\Example\.
C:\xampp\htdocs\Example\..
C:\xampp\htdocs\Example\A
C:\xampp\htdocs\Example\A\.
C:\xampp\htdocs\Example\A\..
C:\xampp\htdocs\Example\A\A1
C:\xampp\htdocs\Example\A\A1\.
C:\xampp\htdocs\Example\A\A1\..
C:\xampp\htdocs\Example\A\A2
C:\xampp\htdocs\Example\A\A2\.
C:\xampp\htdocs\Example\A\A2\..
C:\xampp\htdocs\Example\A\A2\A21
C:\xampp\htdocs\Example\A\A2\A21\.
C:\xampp\htdocs\Example\A\A2\A21\..
C:\xampp\htdocs\Example\A\A2\A22
C:\xampp\htdocs\Example\A\A2\A22\.
C:\xampp\htdocs\Example\A\A2\A22\..
C:\xampp\htdocs\Example\A\A3
C:\xampp\htdocs\Example\A\A3\.
C:\xampp\htdocs\Example\A\A3\..
C:\xampp\htdocs\Example\B
C:\xampp\htdocs\Example\B\.
C:\xampp\htdocs\Example\B\..
C:\xampp\htdocs\Example\C
C:\xampp\htdocs\Example\C\.
C:\xampp\htdocs\Example\C\..
C:\xampp\htdocs\Example\C\C1
C:\xampp\htdocs\Example\C\C1\.
C:\xampp\htdocs\Example\C\C1\..
C:\xampp\htdocs\Example\C\C2
C:\xampp\htdocs\Example\C\C2\.
C:\xampp\htdocs\Example\C\C2\.

Görüldüğü gibi .txt uzantısına sahip olan tüm dosyalar dizinlerden ve alt dizinlerden silindi.

Dizin listeleme işleminden sonra; silme / ekleme /güncelleme vs. aklınıza gelebilecek herhangi bir işlemi gerçekleştirebilirsiniz. Seçim size kalmış..!

Saygı ve muhabbetle!..

Bu içeriği paylaşmak ister misiniz?

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Buradaki içeriklerin tümü kamu malıdır. Kullanılması ve paylaşılması özgürdür.