İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Son dakika Yazarlar
  1. Ana sayfa
  2. Topluluk
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

C# bir yolun bütün alt klasörlerini bulma

bortu313.10.201112 cevap6.323 görüntüleme
2010'den beri114 mesaj
#1
Merhaba arkadaşlar

yeni bir program yazıyorum ve bir kaç işlemden sonra elimde bir yol oluyor örneğin D:\resimler gibi

ben bu yolu alıp bunun içinde bulunan bütün alt klasörlerin yollarını bir arrayliste atmam gerekiyor arrayde olabilir farketmez yeterki bulayım artık yolunu kaç gündür kafa patlatıyorum birçok algoritma denedim hala çözümü bulamadım

yardım edeceklere şimdiden teşekkürler..

---------- Post added at 08:26 ---------- Previous post was at 08:03 ----------


Bende sonra arayacak arkadaşlar için söylüyorum

tamamdır arkadaşlar buldum olayı

Directory.GetDirectories(Path,"*",SearchOption.AllDirectories)

bu kod yani arama ayarlarını böyle yaptıgımızda o klasör ve onun bütün alt klasörleri geliyor :)
Cevaplar
2007'den beri2.589 mesaj
#2
kodu tamamen incelemedim ancak şu işini güzelce görecek gibi. takıldığın noktasında tekrar sorarsan bakarız. ( java'cıyım :P )

using System;
[FONT=monospace]
using System.Collections.Generic;
[/FONT][FONT=monospace]
using System.IO;
[/FONT][FONT=monospace]
class Program
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace]    static void Main()
[/FONT][FONT=monospace]    {
[/FONT][FONT=monospace]    // Get all files in Documents
[/FONT][FONT=monospace]    List<string> dirs = FileHelper.GetFilesRecursive(@"C:\Users\Sam\Documents");
[/FONT][FONT=monospace]    foreach (string p in dirs)
[/FONT][FONT=monospace]    {
[/FONT][FONT=monospace]        Console.WriteLine(p);
[/FONT][FONT=monospace]    }
[/FONT][FONT=monospace]    // Write count
[/FONT][FONT=monospace]    Console.WriteLine("Count: {0}", dirs.Count);
[/FONT][FONT=monospace]
    Console.Read();
[/FONT][FONT=monospace]    }
[/FONT][FONT=monospace]}
[/FONT][FONT=monospace]
static class FileHelper
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace]    public static List<string> GetFilesRecursive(string b)
[/FONT][FONT=monospace]
    {
[/FONT][FONT=monospace]    // 1.
[/FONT][FONT=monospace]    // Store results in the file results list.
[/FONT][FONT=monospace]
    List<string> result = new List<string>();
[/FONT][FONT=monospace]
    // 2.
[/FONT][FONT=monospace]
    // Store a stack of our directories.
[/FONT][FONT=monospace]
    Stack<string> stack = new Stack<string>();
[/FONT][FONT=monospace]
    // 3.
[/FONT][FONT=monospace]
    // Add initial directory.
[/FONT][FONT=monospace]
    stack.Push(b);
[/FONT][FONT=monospace]
    // 4.
[/FONT][FONT=monospace]    // Continue while there are directories to process
[/FONT][FONT=monospace]
    while (stack.Count > 0)
[/FONT][FONT=monospace]    {
[/FONT][FONT=monospace]        // A.
[/FONT][FONT=monospace]        // Get top directory
[/FONT][FONT=monospace]
        string dir = stack.Pop();
[/FONT][FONT=monospace]
        try
[/FONT][FONT=monospace]
        {
[/FONT][FONT=monospace]        // B
[/FONT][FONT=monospace]        // Add all files at this directory to the result List.
[/FONT][FONT=monospace]
        result.AddRange(Directory.GetFiles(dir, "*.*"));
[/FONT][FONT=monospace]
        // C
[/FONT][FONT=monospace]
        // Add all directories at this directory.
[/FONT][FONT=monospace]
        foreach (string dn in Directory.GetDirectories(dir))
[/FONT][FONT=monospace]        {
[/FONT][FONT=monospace]            stack.Push(dn);
[/FONT][FONT=monospace]        }
[/FONT][FONT=monospace]        }
[/FONT][FONT=monospace]
        catch
[/FONT][FONT=monospace]
        {
[/FONT][FONT=monospace]        // D
[/FONT][FONT=monospace]        // Could not open the directory
[/FONT][FONT=monospace]        }
[/FONT][FONT=monospace]    }
[/FONT][FONT=monospace]
    return result;
    } 
[/FONT]}


edit : kodu biraz düzenlemem lazım. tekrar koyacağım.
bortu3 Konuyu açan
2010'den beri114 mesaj
#3
aynen bende buna benzer bişey arıyorum çok teşekkürler yardımın için ancak konuyu actıktan 5 dk sonra çözümü buldum :)

Bende sonra arayacak arkadaşlar için söylüyorum


Directory.GetDirectories(Path,"*",SearchOption.All Directories)

bu kod yani arama ayarlarını böyle yaptıgımızda o klasör ve onun bütün alt klasörleri geliyor

yanlız direk sürücü yolu verilirse hata verecektir örnek C:\ gibi unauthorized accees exception diye diskteki erişilmesi yasak klasörleri de saymaya çalışacağı için örnek System Volume Information gibi. onun çözümünüde siz bulursunuz artık ben buldum :)
2009'den beri1.405 mesaj
#4
annttiigs dedi: ↑
kodu tamamen incelemedim ancak şu işini güzelce görecek gibi. takıldığın noktasında tekrar sorarsan bakarız. ( java'cıyım :P )

[FONT=monospace]....[/FONT]
Aman abi ne yaptın, recursive çağırsan dizin taramalarında daha rahat edersin(muhtemelen de biliyorsun). Bırak callstack'e bassın kod kendini, daha az satır ve daha rahat bu tür işler için ;)
2006'den beri324 mesaj
#5
Aşağıda daha önce otomatik yedekleme için yazdığım recursive var. İnceleyebilirsiniz.

void Basla(string Klasor)
        {
            string[] Klasorler = Directory.GetDirectories(Klasor);
            foreach (string KlDizi in Klasorler)
            {
                DirectoryInfo KlasorBilgisi = new DirectoryInfo(KlDizi);
                //listBox1.Items.Add(KlasorBilgisi.FullName);
                //listBox1.Items.Add(KaynakDosya + KlasorBilgisi.FullName.Substring(22));
                // Klasörleri kopyalıyoruz.. Aslında aynısını oluşturuyoruz.
                Directory.CreateDirectory(KaynakDosya + KlasorBilgisi.FullName.Substring(22));
                // Klasördeki dosyaları listeliyoruz...
                string[] Dosyalar = Directory.GetFiles(KlasorBilgisi.FullName);
                // Döngüye sokuyoruz hepsini tek tek kopyalamak için.
                foreach (string Dosya in Dosyalar)
                {
                    FileInfo DosyaBilgisi = new FileInfo(Dosya);
                    //listBox1.Items.Add(DosyaBilgisi.Name);
                    File.Copy(DosyaBilgisi.FullName, KaynakDosya + "\\" + KlasorBilgisi.FullName.Substring(22) + "\\" + DosyaBilgisi.Name);
                }

                Basla(KlasorBilgisi.FullName);
            }

        }
2007'den beri2.589 mesaj
#6
raxetul dedi: ↑
Aman abi ne yaptın, recursive çağırsan dizin taramalarında daha rahat edersin(muhtemelen de biliyorsun). Bırak callstack'e bassın kod kendini, daha az satır ve daha rahat bu tür işler için ;)
ben çok hızlı bir tarama ile bu kodu internetten edindim. çok da fantastik bir şey değil zaten. Aslında kişilere güzel bir stack kullanım örneği içeriyor. recursive; az satır, kolay okuma, data arttıkça exponansiyel yavaşlama, yüksek seviyeli dillerde insecure code gibi faydalı ve zararlı özellikleri olan bir kod yazma yöntemidir. tavsiyem düşük seviyede recursive olsa da yükseldikce daha straight forward ve looplara güvenmek yönünde olacak. tabi bu bir tercih meselesi. sonuçta kaç tane pc'de milyonlarca directory olabilir ki ?
2009'den beri1.405 mesaj
#7
Valla ben C/C++'çı gibi bakıyorum ister istemez dünyaya. :) Burada exponansiyel yavaşlama olmayacaktır çünkü exponansiyel görünse de aynı sayıda dizin taranacak ve algoritma karmaşıklığı yine aynı olacaktır.(Algoritma karmaşıklığı döngüsel ve recursive çağrılarda kesinlikle şudur demek mümkün değildir.) Ha şuna katılıyorum, işletim yığıtı aç kapa işlemleri, ve kullanılan bellek alanı az da olsa biraz daha fazla olabilir (olmayabilir de çünkü loop için kullanılan stack kodu nispetten daha yavaş kodlar içeriyor olabilir).

Recursive fonksiyonları nükleer teknoloji gibidir, doğru kullanılırsa(ikili ağaçlar) çok daha sağlam ve güvenilirdir ama yanlış kullanılırsa ( en basitinden fibonacci) işlemciyi gereksiz yere zorlatır. Dizin taramada ise yine ağaç yapısı olduğu için ben recursive fonksiyon kullanırım.
2008'den beri357 mesaj
#8
kodu try-catch bloğu içerisne al. hata yaptığında catch kısmına düşsün.
2007'den beri2.589 mesaj
#9
annttiigs dedi: ↑
ben çok hızlı bir tarama ile bu kodu internetten edindim. çok da fantastik bir şey değil zaten. Aslında kişilere güzel bir stack kullanım örneği içeriyor. recursive; az satır, kolay okuma, data arttıkça exponansiyel yavaşlama, yüksek seviyeli dillerde insecure code gibi faydalı ve zararlı özellikleri olan bir kod yazma yöntemidir. tavsiyem düşük seviyede recursive olsa da yükseldikce daha straight forward ve looplara güvenmek yönünde olacak. tabi bu bir tercih meselesi. sonuçta kaç tane pc'de milyonlarca directory olabilir ki ?
hedef sorunu çözmekse izlenilen yollar sadece süreçtir :)

ne demiş adamlar; insanlar yolda karşılaştığınız fırtınalara değil gemiyi karaya çıkarıp çıkarmadığınıza bakar :)
2011'den beri708 mesaj
#10
bende bu kodla düzelttim işine yarayacaktır

using System;using System.Collections.Generic;using System.IO;class Program{ static void Main() { // Get all files in Documents List<string> dirs = FileHelper.GetFilesRecursive(@"C:\Users\Sam\Documents"); foreach (string p in dirs) { Console.WriteLine(p); } // Write count Console.WriteLine("Count: {0}", dirs.Count); Console.Read(); }}static class FileHelper{ public static List<string> GetFilesRecursive(string b) { // 1. // Store results in the file results list. List<string> result = new List<string>(); // 2. // Store a stack of our directories. Stack<string> stack = new Stack<string>(); // 3. // Add initial directory. stack.Push(b); // 4. // Continue while there are directories to process while (stack.Count > 0) { // A. // Get top directory string dir = stack.Pop(); try { // B // Add all files at this directory to the result List. result.AddRange(Directory.GetFiles(dir, "*.*")); // C // Add all directories at this directory. foreach (string dn in Directory.GetDirectories(dir)) { stack.Push(dn); } } catch { // D // Could not open the directory } } return result; } }
bortu3 Konuyu açan
2010'den beri114 mesaj
#11
ooo döktürmüşsünüz yine :) sorunumu hallettim ama yineden yorumlarınız iyi geldi.

bu arada yaptığım programı bitirdim isteyenler bakabilir

http://code.google.com/p/paradox-resim-temizleyici/

b
elki işinize yaramaz ama olsun :) bu forumdan bir kişinin işine yarıcağı kesinde :)
2008'den beri3.195 mesaj
#12
Emeğine sağlık.

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.