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. 

[java]

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
}
}

[/java]

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. 

 

[java]

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
}
}

[/java]

Ü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. 

 

[java]

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
}
}
}

[/java]

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.

 

Hakkında 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 :)

Kontrol Et

İşletim Sistemlerine Giriş

İşletim sistemleri, bilgisayar donanımları ve kullanıcılar arasında iletişim sağlamak amacıyla yazılmış olan programlardır. Bilgisayar Nedir? …

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.