X
  • 2 ay ago
Categories: Bilgisayar MühendisliğiJavaProgramlamaYazılım Mühendisliği

Java’da Seçilen Klasörün İçindeki Dosyaları Recursive Olarak Listeleme

Merhaba arkadaşlar, Bugün ki dersimizde java programlama dili ile seçilen klasörün içindeki tüm dosyaları(klasör hariç) listeleyen bir program yapacağız. Bunu yaparken recursive olmasını sağlayacağız. Öncelikle Netbeans IDE programını açarak bir proje oluşturalım.

Evet projemizi oluşturduk. Şimdi ise kodlarımızı yazmaya başlamadan önce yapacaklarımızı sırasıyla belirtelim.

  1. Öncelikle bir klasör seçmek gerekiyor = Bunun için JFileChooser nesnesini kullanabiliriz. (javax.swing.jFileChooser) Klasör seçtikten sonra oradan alacağımız dosya konumunu String olarak döndürmemiz gerektiğini düşünürsek, String döndüren bir metot kullanmamızın uygun olacağını söyleyebiliriz.
  2. Dönen String değerinin yani klasörün konumunun(path) içinde bulunan dosya ve klasörleri bir yere atmamız gerektiğinden bunun için String veri tipini kullanan bir ArrayList kullanabiliriz.
  3. Seçtiğimiz klasörün içinde dosya ve yine klasörler bulunabilir. Dosyaları alabiliriz fakat yine klasörlerin içine girip ilgili aramalar yapmamız gerekebilir. Hatta girdiğimiz klasörlerin içinde de klasörler bulunabilir. Bunu yapmak için recursive metot kullanmamız gerektiğini düşünebiliriz. Kullanacağımız metot kesinlikle recursive olmalıdır. Bu sayede fazla kod kalabalığı olmadan istediğimiz sonuca ulaşabiliriz. (recursive’in önemli bir faydası)
  4. Sonucu console a yazdıralım.

 

Üstteki algoritmik yapıyı oluşturduktan sonra şimdi bunları koda dökme vakti geldi. Öncelikle birinci adımı uygulayalım.

Birinci Adım : Bu adımda klasör seçen bir fonksiyon yazacağız. (Fonksiyon ismi “public static String klasorSec()” )

Kullanacağımız Nesneler : javax.swing.JFileChooser

Şimdi aşağıdaki kodu inceleyelim. 



import java.util.ArrayList;
import javax.swing.JFileChooser;

public class KlasorSec {
    
    public static String klasorSec(){
        JFileChooser jFileChooser = new JFileChooser(); // Nesnemizi oluşturduk
        jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// burada  directory(klasör) seçebileceğimiz belirttik
        jFileChooser.showOpenDialog(null); // Dialog penceresinin açılmasını sağladık
        try {
             return jFileChooser.getSelectedFile().getAbsolutePath();   // seçilen klasörün yolunu aldık. Seçim yapmadıysak catche düşecektir.
        } catch (Exception e) {
            return null; // Eğer seçim yapamadıysak buraya düşer ve null değerini alır
        }
            
    }
    
    public static void main(String[] args) { // metotumuzu çalıştırmamız için main fonksiyonu yazıyoruz
        String klasorYolu = KlasorSec.klasorSec(); // seçilen klasör yolunu nesneye atıyoruz
        if(klasorYolu != null) // eğer seçim boş değilse yani nulll değilse işlemlerimizi bu koşul ifadesinin altında yapacağız
            System.out.println("Klasor : "+klasorYolu); // console ekranına yazdırıyoruz
        else
            System.out.println("Herhangi bir klasör yolu seçilmemiştir."); // herhangibir klasör seçmezsek bu hatayı console ekranından verdiriyoruz
    }
}


Ardından projemizi çalıştırıyoruz ve bir klasör seçiyoruz.
Klasör seçtikten sonra Open butonuna basıyorum ve aşağıdaki sonucu alıyorum


Gördüğünüz üzere gayet güzel gidiyoruz. Bir de klasör seçmeden cancel butonuna basıp çıkalım ve sonucu görelim.


Evet… Şimdi try, catch yapısını kullanmanın güzelliğini de görmüş olduk. Eğer bu yapıyı kullanmadan kodları arka arkaya yazıyor olsaydık, java.lang.NullPointerException hatası alacaktık ve programımız hatayı aldığı yerden itibaren çalıştırması gereken altındaki kodları çalıştırmayacaktı. Yani programımız istemediğimiz bir şekilde sonlanacaktı. 

Birinci adımı tamamladığımıza göre, şimdi ikinci adıma geçelim.

İkinci Adım : Şimdi dönen String değerinin yani klasör yolunun içindeki dosyaları taradıktan sonra dosya isimlerini atacağımız String türünde bir ArrayList tanımlayalım.  

Kullanacağımız Nesneler : java.util.ArrayList

Şimdi aşağıdaki kodu inceleyelim. 

 


import java.util.ArrayList;
import javax.swing.JFileChooser;

public class KlasorSec {
    
    ArrayList<String> dosyaList = new ArrayList<String>(); // ikinci adımda gereken dosyaList global olarak tanımladım. Bu sayede bu sınıfta istediğim fonksiyondan erişebilirim
    
    public static String klasorSec(){
        JFileChooser jFileChooser = new JFileChooser(); // Nesnemizi oluşturduk
        jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// burada  directory(klasör) seçebileceğimiz belirttik
        jFileChooser.showOpenDialog(null); // Dialog penceresinin açılmasını sağladık
        try {
             return jFileChooser.getSelectedFile().getAbsolutePath();   // seçilen klasörün yolunu aldık. Seçim yapmadıysak catche düşecektir.
        } catch (Exception e) {
            return null; // Eğer seçim yapamadıysak buraya düşer ve null değerini alır
        }
            
    }
    
    public static void main(String[] args) { // metotumuzu çalıştırmamız için main fonksiyonu yazıyoruz
        String klasorYolu = KlasorSec.klasorSec(); // seçilen klasör yolunu nesneye atıyoruz
        if(klasorYolu != null) // eğer seçim boş değilse yani nulll değilse işlemlerimizi bu koşul ifadesinin altında yapacağız
            System.out.println("Klasor : "+klasorYolu); // console ekranına yazdırıyoruz
        else
            System.out.println("Herhangi bir klasör yolu seçilmemiştir."); // herhangibir klasör seçmezsek bu hatayı console ekranından verdiriyoruz
    }
}


Üstteki kodları incelediğiniz zaman ArrayList’i nasıl oluşturduğumuzu da görmüş olursunuz.

Şimdi ArrayList oluşturduğumuza göre Üçüncü adıma geçelim.

 

Üçüncü Adım : Şimdi esas işi yapacak olan recursive fonksiyonumuzu yazalım.  

Şimdi aşağıdaki recursive kodu inceleyelim.  dosyaPathDondur fonksiyonuna bakalım. İşlemi yapan recursive fonksiyon budur. 

 


   
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;

public class KlasorSec {

    ArrayList dosyaList = new ArrayList(); // ikinci adımda gereken dosyaList global olarak tanımladım. Bu sayede bu sınıfta istediğim fonksiyondan erişebilirim

    public static String klasorSec() {
        JFileChooser jFileChooser = new JFileChooser(); // Nesnemizi oluşturduk
        jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// burada  directory(klasör) seçebileceğimiz belirttik
        jFileChooser.showOpenDialog(null); // Dialog penceresinin açılmasını sağladık
        try {
            return jFileChooser.getSelectedFile().getAbsolutePath();   // seçilen klasörün yolunu aldık. Seçim yapmadıysak catche düşecektir.
        } catch (Exception e) {
            return null; // Eğer seçim yapamadıysak buraya düşer ve null değerini alır
        }
    }

    public void klasorListeleriniKonsoldaGoster() { // dosya isimlerini yazdırdığımız fonksiyon
        dosyaList.forEach((dosyaPath) -> { // 
            System.out.println("Dosya Yolu : " + dosyaPath);
        });
    }

    public void dosyaPathDondur(File fileDirectory, List dosyaList) { // iki tane parametremiz var 
        
        if (fileDirectory.exists() && fileDirectory.isDirectory()) { // o dosya gerçekten varsa ve klasör ise
            for (File chDir : fileDirectory.listFiles()) { // içindeki dosyaları ve klasörleri listeler
                if (chDir.isDirectory()) { // eğer klasör ise
                    dosyaPathDondur(chDir, dosyaList); // tekrar fonksiyona girer - Recursice
                } else {
                    dosyaList.add(chDir.getAbsolutePath()); // lsitemize ekleme işlemi yapar
                }
            }
        }
    }

    public static void main(String[] args) { // metotumuzu çalıştırmamız için main fonksiyonu yazıyoruz
        String klasorYolu = KlasorSec.klasorSec(); // seçilen klasör yolunu nesneye atıyoruz
        if (klasorYolu != null) // eğer seçim boş değilse yani nulll değilse işlemlerimizi bu koşul ifadesinin altında yapacağız
        {
            System.out.println("Klasor : " + klasorYolu); // console ekranına yazdırıyoruz
            KlasorSec klasorSec = new KlasorSec(); // nesnemizi oluşturuyoruz
            klasorSec.dosyaPathDondur(new File(klasorYolu), klasorSec.dosyaList); // gerekli parametreleri giriyoruz
            klasorSec.klasorListeleriniKonsoldaGoster(); // konsola yazdırıyoruz
        } else {
            System.out.println("Herhangi bir klasör yolu seçilmemiştir."); // herhangibir klasör seçmezsek bu hatayı console ekranından verdiriyoruz
        }
    }
}


Gerekli açıklamaları yorum olarak ekledim. Bunları inceleyiniz.

Dördüncü Adım : Şimdi console çıktısına bakalım.

Aşağıdaki klasörü seçiyoruz.

Evet gördüğünüz gibi gayet başarılı bir şekilde istediğimizi yapmış olduk. Recursive fonksiyonlar oldukça faydalı olup az satırla çok iş yapmamızı sağlarlar. Bu örneği kendiniz de yazmaya çalışarak geliştirebilirsiniz. Okuduğunuz için teşekkür ederim.

 

Ali Demirci :Ben Ali Demirci... 1991 Ankara doğumluyum. Ankara da yaşıyorum. Fırsat buldukça öğrendiklerimi burada paylaşıyorum. Java ile haşır neşirim. Android'den asla vazgeçemem. Öğrenmeye bayılırım. Yeni şeyler öğrendiğimde, geçmişteki projelerimde keşke böyle yapsaydım diye çok üzülmüşümdür. O yüzden öğrenmekten korkmayın. Takıldığınız yerleri mutlaka sorun. Biliyorsam yanıt veririm. Bilmiyorsam yol gösteririm. Teşekkürler :)