Makale Özeti

Merhabalar bu makalemizde sonsuza uzanan ağaç yapılarını çözümlemek için Recursive Metotlarını inceliyor olacağız.

Makale

Sonsuza uzanan ağaç yapılarında çözümleme gereği duyduğumuzda Recursive Metotları yani kendini tekrar çağıran metotları kullanmamız kaçınılmaz olacaktır.
Sonsuza uzanan ağaç yapılarını örnek vermek gerekirse, işletim sistemlerindeki klasörleme mantığına bakabiliriz. Şimdi bir klasörün içerisinde başka bir klasör, o klasörün içerisindede başka bir klasör daha bulunabilir. Yani bu işlem N tane kadar gerçekleştirilebilir. Ve birde klasörlerin içerisindeki dosyaları işin içine katacak olursak şema yapısı dahada kabarabilir.

Peki ya biz bir klasör içerisindeki tüm alt klasörleri (kendininde n tane kadar alt klasörü dahil) tüm klasörler görmek istersek,
Yada bir klasörün içerisindeki tüm alt klasörlerinin içerisindeki (kendininde n tana kadar alt klasörü dahil) tüm dosyaları görmek istersek, bunu nasıl gerçekleştirebiliriz.

Biz bir metot yazsak, metot geriye bir liste gönderse ve parametre olarakta klasör yolu alsa, daha sonra bu klasör içerisindeki tüm klasörleri dizi içerisinde göndersek acaba nasıl olur?

Hemen deneyelim. 

        static List<string> KlasorleriGetir(string Yol)
        {
            //Gecerli bir klasor yolumu
            if (Directory.Exists(Yol))
            {
                //Generic Dizi olusturuluyor
                List<string> dizi = new Listt<string>();

                //Generic Dizinin,
                //Verilen Yol icerisindeki klasorleri ekledik
                dizi.AddRange(Directory.GetDirectories(Yol));
                
                return dizi;
            }
            else
                return null;
        }

Visual Studio 2008 yolunu belirterek yukarıdaki metodumuzu çağırdığımızda;

 

Bize sadece 6 tane klasörün olduğunu söylüyor. Oysaki Visual Studio 2008 dizini içerisinde bir çok klasör var. Peki iç içe olan klasörlere nasıl ulaşacağım ?

 

Yukarıdaki yazdığımız ilk metodumuzu aşağıdaki gibi değiştirerek,

        static List<string> KlasorleriGetir(string Yol)
        {
            //Gecerli bir klasor yolumu
            if (Directory.Exists(Yol))
            {
                //Generic Dizi olusturuluyor
                List<string> dizi = new Listt<string>();

                //Generic Dizinin,
                //Verilen Yol icerisindeki klasorleri ekledik
                dizi.AddRange(Directory.GetDirectories(Yol));

                foreach (string klasor in Directory.GetDirectories(Yol))
                    dizi.AddRange(KlasorleriGetir(klasor));

                return dizi;
            }
            else
                return null;
        }

çalıştıracak olursak;

console'da görüldüğü gibi ben C:\WINDOWS\Microsoft.NET dizinini belirtmeme rağmen, bana 2 yerine, çünkü ben işletim sistemini 64X kullanıyorum o yüzden Microsoft.NET dizinimde Framework ve Framwork64 klasörleri bulunuyor. Yani bana normalde 2 klasör getirmesi gerekirdi peki nasıl olduda tüm hepsine getirdi?

ilk önce diziye kendi yolundaki alt klasörleri buldu. Daha sonra bulduğu alt klasörleri bir foreach iterasyonuna soktu, iterasyon sonucunda alt dizinleride iterasyona soktu böyle tüm alt klasörleri olan klasörler iterasyona girerek, tüm klasörlerin yollarını almış olduk. Bu işlemi dahada iyi anlamak için Debug modunda inceleyerek görmek lazım.

Yukarıdaki son örneği debug modunda çalıştırdığımızda;

yukarıdaki şemada gördüğünüz gibi, ilk iterasyona girdiğinde diziye sadece 2 klasör yolu ekleniyor.
Daha sonra bu iki klasör yolları sırayla olmak üzere ikiside iterasyona giriyor.

Gördüğünüz gibi ilk önce Framework dizini iterasyona girdi. Bunu yol değişkenine bakarak görebilirsiniz.
Ve bu dizinden 5 klasör çıktı.

Yukarıda gördüğünüz gibi iterasyonda girilen dizin yolları bir üst dizinde çıkan alt klasörlerden başka bir şey değil :)

 

Bu örnekte, her metot içerisinde, Generic bir dizi oluşturduk. Bu sağlıklı bir yöntem değil, statik olarak tanımlar isek, performans açısından çok daha iyi olacaktır. Çünkü her defasında yeniden oluşturuluyor. Burdan benim kullanma nedenim ise, size değişkenlerin birbirine karışmadığını göstermek içindi, yani her metot dizi adında bir generic liste ekleniyor ve dönen generic list yine aynı name de olan başka bir yaşam döngüsü içerisinde bir generic liste ekleniyor...

Klasör içerisindeki Dosyalarında yollarını almak isterseniz, ikinci bir foreach tanımlayarak Directory.GetFiles metoduyla yapabilirsiniz.

Bu makalemizde iç içe sonsuza uzanan ağaç yapılarında nasıl dıdısının dıdısına kadar ulaşabileceğimiz küçük bir örnekle görmüş olduk

 

Bir sonraki makalemde görüşmek dileğiyle

Sağlıcakla kalın

Serkan PEKTAŞ