Wczytanie wszystkich folderów

Witam. Co zrobić aby używając:

FolderBrowserDialog folder = new FolderBrowserDialog();

wczytać zawartość zaznaczonego folderu oraz zawartość wszystkich jego podfolderów itd.

Proszę o pomoc.

  • Na początek, przyda Ci się using System.IO;
    W ramach przykładu użyłem ListBoxa.

    funkcja dodająca ;-)

    private void ListDirectory(string path) {
        foreach (string f in Directory.GetDirectories(path))
        {
            ListDirectory(f);
        }      
        foreach (string f in Directory.GetFiles(path)) {
            this.listBox1.Items.Add(f);
        }
    
    }
    

    A tutaj wywołanie okna dialogu:

        if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            string path = this.folderBrowserDialog1.SelectedPath;
            ListDirectory(path);
        }
    

    W ramach tłumaczenia, drugi listing znajduje się w zdarzeniu kliknięcia w button - ale to się tyczy oczywiście mojego przykładu. Po wybraniu folderu, którego struktura będzie wyglądać tak:

    + Nazwa zespołu
    |--+ Pierwsza płyta
    |...|-- Piosenka 1
    |...|-- Piosenka 2
    |...|-- Piosenka 3
    |
    |--+ Druga płyta
    |...|-- Piosenka 1
    |...|-- Piosenka 2
    |
    |-- Piosenka 1 [w głównym folderze zespołu]
    |-- Piosenka 2
    

    Czyli, jak widać, główny folder ma dwa podfoldery, które kolejno zawierają, trzy i dwie piosenki. Ponadto, ma jeszcze dwie piosenki nie przypisane do konkretnej płyty.

    Podana funkcja, będzie działać tak: [na rzecz głównego folderu];
    1. Wywoływanie funkcji na rzecz podanej ścieżki. 2. Funkcja sprawdza czy wewnątrz znajdują się jakieś foldery, jeżeli tak, przechodzi do punktu 1. jeżeli nie, 3. 3. Funkcja listuje wszystkie znajdujące się wewnątrz pliki i dodaje ich ścieżkę do listboxa. 4. Koniec.


    W efekcie, w listboxie powinno się pojawić takie coś:
    GłównyFolder/PierwszaPłyta/Piosenka1
    GłównyFolder/PierwszaPłyta/Piosenka2
    GłównyFolder/PierwszaPłyta/Piosenka3
    GłównyFolder/DrugaPłyta/Piosenka1
    GłównyFolder/DrugaPłyta/Piosenka2
    GłównyFolder/Piosenka1
    GłównyFolder/Piosenka2


    Oczywiście w formie całej ścieżki, która zresztą będzie Ci potrzebna, ale możesz do ListBoxa dodać swoją klasę, np.

    class Piosenka {
       String name, String path;
    }
    

    // jeszcze mała uwaga, będziesz potrzebował nadpisać metodę ToString(), slówko: override :-)

    Tutaj mały przykład wykorzystania: var p = new Piosenka(); p.name = "Name"; p.path = "Path"; listBox1.Items.Add(p); MessageBox.Show(((Piosenka)(listBox1.Items[0])).name, ((Piosenka)(listBox1.Items[0])).path);



    W messageBox rzutujesz na Piosenke, ale ładniej będzie jak zrobisz to w ten sposób:

    Piosenka p = (Piosenka)listBox.Items[index];
    

  • Do tego służy opcja SearchOption.AllDirectories, pozwala wyświetlić wszystkie plik w folderze i podfolderach.

    Gotowy kod:

            FolderBrowserDialog fdb = new FolderBrowserDialog();
            if (fdb.ShowDialog() == DialogResult.OK)
            {
                StringBuilder Lancuch = new StringBuilder();
    
                DirectoryInfo obecny = new DirectoryInfo(fdb.SelectedPath);
    
                foreach (FileInfo plik in obecny.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    Lancuch.AppendLine(plik.FullName);
                }
    
    
                Form f = new Form();
                TextBox tb = new TextBox();
                tb.Multiline = true;
                tb.ScrollBars = ScrollBars.Both;
                tb.Dock = DockStyle.Fill;
                tb.Text = Lancuch.ToString();
                f.Controls.Add(tb);
                f.ShowDialog();
            }
    

    Objaśnienie:

    Pokaż okno wybierania foldera i jeżeli użytkownik wybierze i naciśnie OK:

            FolderBrowserDialog fdb = new FolderBrowserDialog();
            if (fdb.ShowDialog() == DialogResult.OK)
    

    Pobierz informacje o wybranym folderze:

            DirectoryInfo obecny = new DirectoryInfo(fdb.SelectedPath);
    

    A następnie pobierz informacje o każdym pliku który znajduje się w tym folderze i w każdym podfolderze (wzorzec .):

            foreach (FileInfo plik in obecny.GetFiles("*.*", SearchOption.AllDirectories))
    

    Każdą pełną nazwę pliku (wraz ze ścieżką) dodaj do konstruktora łańcucha tekstowego:

          Lancuch.AppendLine(plik.FullName);
    

    Stwórz formatkę z polem tekstowym:

          Form f = new Form();
          TextBox tb = new TextBox();
          tb.Multiline = true;
          tb.ScrollBars = ScrollBars.Both;
          tb.Dock = DockStyle.Fill;
          f.Controls.Add(tb);
          f.ShowDialog();
    

    I pokaż w tym polu tekstowym wszystkie pliki w folderze i jego podfolderach:

          tb.Text = Lancuch.ToString();
    

    Powinieneś nacisnąć kciuk do góry, jeżeli ta informacja pomogła Tobie. Z góry dziękuję.

  • Można jeszcze wyświetlić nazwę katalogu:

       private void ListDirectory(string path) 
        {
            this.listBox1.Items.Add(path);
            foreach (string f in Directory.GetDirectories(path))
            {
                ListDirectory(f);
            }   
            foreach (string f in Directory.GetFiles(path)) 
            {
                this.listBox1.Items.Add(f);
            }
        }
    

    Pozdrawiam...

Zaloguj się, aby dodać swoją odpowiedź