Kurumsal ve Kişisel ASP.NET C# SQL Eğitiminde Ankara'da Zirve

Rekürsif Dizin Alma

System.IO kütüphanesi içerisinde yer alan Directory.GetFiles(“c:\\Windows”) fonksiyonu ile parametre olarak verilen dizin yolunun sahip olduğu tüm dosyalar alınabilir. Geriye string bir dizi döndüren GetFiles metodu, sadece belirtilen dizinin alt dosyalarını alır. Yani dizinin alt dizinlerinin dosyaları alınmaz. Eğer amacınız bunu yapmak ise, her alt dizini gezer ve onun dosyalarını alırsınız. Bu işlemde bir for döngüsü aracılığı ile yapılabilir. Fakat her dizininin altına girmek için for döngüsü kullanmanız biraz zahmetli ve işlevsellikten uzak olabilir. Örneğin “C:\WINDOWS\system32\ReinstallBackups\0000\DriverFiles\i386” içerisinde bulunan “processr.sys” dosyasını alabilmeniz için, 5 adet for döngüsünü iç içe kullanmanız gerekir. Unutmayın ki dizin derinliğinin ne kadar daldan oluştuğunu çoğu zaman bilemezsin. Bilemediğiniz bir derinliğe de for döngüsü yazmak biraz anlamsız olur.

İşte tam bu noktada, çoğu programcının sevmediği bir yapı olan Rekürsif (Özyinelemeli) fonksiyonlar yardımımıza yetişir. Her dal içerisinde en derine inen ve en derinde artık dizin kalmadığında geri dönen bir fonksiyon rekürsif olarak yazılabilir. Öncelikle yukarıda kullandığımız “Directory.GetFiles” metodunun kullanımını inceleyelim.

string[] dosyaYollari = Directory.GetFiles(“c:\\Windows”);

Yukarıdaki yazdığımızDirectory.GetFiles metodu , parametre olarak gönderilen “c:\\Windows” dizininin sahip olduğu dosyaları, string bir dizi olarak geri döndürüyor. Biz de dosya yollarını, tanımladığımız string dizimiz (dosyaYollari) içerisine alıyoruz. Şimdi Windows dizininin alt dizinleri içerisinde bulunan dosyaları bir ArrayList içerisine alalım.

string[] dosyaYollari = Directory.GetFiles(“c:\\Windows”);
System.Collections.ArrayList listeYollar = new System.Collections.ArrayList();

listeYollar.AddRange(dosyaYollari);

string[] dizinYollari = Directory.GetDirectories(“c:\\Windows”);

for (int i = 0; i <= dizinYollari.GetUpperBound(0); i++) { string[] altDosyaYollari = Directory.GetFiles(dizinYollari[i]); listeYollar.AddRange(altDosyaYollari); } Yukarıda öncelikle “C:\Windows” dizini içerisinde bulunan dosyalar alınmış ve ArrayList içerisine yerleştirilmiştir. Ardından “C:\Windows” dizininin sahip olduğu alt dizinler “Directory.GetDirectories” metodu ile “dizinYollari” dizisine alınmıştır. Kurulan bir for döngüsü aracılığı ile, “dizinYollari” dizisinin her elamanının (yani her alt dizin yolunun) alt dosyaları “altDosyaYollari” dizisine alınmaktadır. Alınan her alt dizin dosyaları da ArrayList içerisinde eklenmiştir. Eğer bir alt dala daha inmek isterseniz, o zaman for döngüsü içerisinde bir for döngüsü daha açar ve onun içerisinde inersiniz. Aşağıdaki kodlarla bunu da örneklendirelim. string[] dosyaYollari = Directory.GetFiles(“c:\\Windows”); System.Collections.ArrayList listeYollar = new System.Collections.ArrayList(); listeYollar.AddRange(dosyaYollari); string[] dizinYollari = Directory.GetDirectories(“c:\\Windows”); for (int i = 0; i <= dizinYollari.GetUpperBound(0); i++) { string[] altDosyaYollari = Directory.GetFiles(dizinYollari[i]); listeYollar.AddRange(altDosyaYollari); string[] altDizinYollari = Directory.GetDirectories(dizinYollari[i]); for (int j = 0; j <= altDizinYollari.GetUpperBound(0); j++) { string[] altAltDosyaYollari = Directory.GetFiles(altDizinYollari[i]); listeYollar.AddRange(altAltDosyaYollari); } } Bu alt dizin içerisine inmede sınır olmadığını ve her bir alt dizinin gezilmesi için bir for döngüsüne ihtiyaç olduğunu sanırım anladınız. Şimdi biz tüm alt dizinleri gezip dizinlerin dosyalarını alan rekürsif fonksiyonumuzu yazalım. void DosRek(string yol) { string[] dosyalar = Directory.GetFiles(yol); string[] dizinler = Directory.GetDirectories(yol); listeYol.AddRange(dosyalar); for (int i = 0; i <= dizinler.GetUpperBound(0); i++) DosRek(dizinler[i]); } Yukarıdaki fonksiyonu bir button ile çağıralım ; System.Collections.ArrayList listeYol = new System.Collections.ArrayList(); private void button1_Click(object sender, EventArgs e) { DosRek(“c:\\Windows”); }

“DosRek” fonksiyonumuzu biraz açıklamak gerekirse, öncelikli yapılan, gönderilen yolun alt dizin ve dosyalarının alınmasıdır. Alınan alt dosyalar ArrayList içerisine eklenirken, alt dizinler ile tekrar kendisi çağrılır. Dolayısıyla tüm alt dallar gezilir. Bu gezme işleminde ilk başlanılan dizin içerisinde en alta kadar inilir, dizin kalmayınca yukarıya çıkılmaya başlanır.

rekursif-dizin-alma-1

rekursif-dizin-alma-1

Yukarıdaki diagram ile, dizinlerin gezilme sırası belirtilmiştir.

Yorum Yapılmamış

Bir cevap yazın