Verzeichnis mit Unterverzeichnis auslesen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Verzeichnis mit Unterverzeichnis auslesen

    Hallo, ich habe ein wahrscheinlich sehr leicht zu lösendes Problem:

    Ich möchte mir alle Dateien mit einer bestimmten Endung in einem vorher ausgewählten Pfad anzeigen und in einer ListBox ausgeben lassen. Mein Code sieht so aus:

    Quellcode

    1. lblPfad.Text = glostrPfad
    2. Directory.SetCurrentDirectory(glostrPfad)
    3. Dim i As Integer = 0
    4. Dim strliste() As String
    5. strliste = Directory.GetFiles(glostrPfad, "*.inp", SearchOption.AllDirectories)
    6. For i = 1 To glostrPfad.Count - 1
    7. lbDateien.Items.Add(strliste(i))
    8. Next


    glostrPfad ist dabei der zuvor über den FolderBrowserDialog ausgewählte Ordner.
    Prinzipiell funktioniert das auch, es wird aber nur der erste von etwa 10 Unterordnern durchsucht. Allerdings sämtliche Unterordner dieses Unterordners.

    Ordner1 ->
    Unterordner 1 -> UO 1.1
    ->UO 1.2
    ->UO 1.3 ...
    Unterordner 2 -> UO 2.1
    ->UO 2.2
    ->UO 2.3 ...
    Unterordner 3 -> UO 3.1
    ->UO 3.2
    ->UO 3.3 ...
    usw.
    Unterordner 1 wird mit seinen Unterordnern durchsucht, Unterordner 2 und 3 nicht, so als wäre Unterordner 1 als Ausgangsordner ausgewählt, aber mit

    Quellcode

    1. lblPfad.Text = glostrPfad
    wird mir zuvor der richtige Ordenr angezeigt.

    Ich hoffe, ich konnte mich verständlich machen ;(
    Aber es
    huhu Tex,

    ich hab dir mal was gebastelt hehe :)

    VB.NET-Quellcode

    1. Imports System.IO
    2. Class MainWindow
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    4. lblPfad.Text = pfad
    5. Call SucheAlleOrdner(pfad)
    6. End Sub
    7. Private Sub SucheAlleOrdner(ByVal Pfad As String)
    8. Dim AlleOrdner() As String
    9. AlleOrdner = Directory.GetDirectories(Pfad)
    10. For i As Integer = 0 To AlleOrdner.Length - 1
    11. If AlleOrdner(i) <> Pfad Then
    12. lbDateien.Items.Add(AlleOrdner(i))
    13. Call SucheAlleOrdner(AlleOrdner(i))
    14. End If
    15. Next i
    16. End Sub
    17. End Class


    Versuch bitte den Quellcode zu verstehen und kopier ihn nicht nur einfach :!:

    Grüßle
    Putzi

    PS: Ich arbeite mit WPF also aufpassöön :D
    .NET kann das besser:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim di As New System.IO.DirectoryInfo("c:\temp")
    3. For Each fi As System.IO.FileInfo In di.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
    4. ComboBox1.Items.Add(fi.FullName)
    5. Next
    6. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So, erstmal vielen Dank
    @RodFromGermany:
    Ich nehme das mal so hin, aber ich kann nicht behaupten, es wirklich zu verstehen. Davon abgesehen - was ist eine C&P-Bremse?

    @Iputzhiernur
    Verstehe ich das richtig, dass zunächst über Directory.GetDirectories alle Unterverzeichnisse erfasst werden?
    Die For...Next-Schleife müsste dann diese Ordner der Reihe nach durchgehen. Aber was passiert da innerhalb der Schleife???
    Und was ist WPF??? WTF kenne ich, aber WPF???

    Ich muss dazu sagen, dass ich bis vor Kurzem auf VB 5 unterwegs war. Naja, um ehrlich zu sein ist das hier mein erstes VB 20210-Projekt. Learning by doing sozusagen. Da ist vieles gewöhnungsbedürftig ;(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TexMurphy“ ()

    Die C&P Bremse sind denke ich mal extra eingearbeite Fehler im Code, das man ihn nicht einfach Blind kopieren kann.

    Ansonsten ist der Code von Rod nicht optimal, weil es Verzeichnisse geben kann auf die man keinen Zugriff hat, wie z.B. System Ordner. Da würde die Schleife dann abbrechen und die restlichen Verzeichnisse nicht mehr einlesen.

    Das erste Beispiel arbeitet mit Rekursion, also die Funktion ruft sich immer wieder selbst auf wenn noch weitere Unterverzeichnisse vorhanden sind.

    Es werden erstmal alle Ordner des Initial Ordners in ein Array geschrieben, danach in der Schleife durchlaufen und jedesmal die Funktion nochmal aufgerufen welche dann wieder die Ordner des Unterordners auflistet und sich aufruft usw.

    Was WPF ist kann dir u.a. Google sagen wenn sowas nicht weißt.
    Ah, danke schön.
    Kann mir denn auch jemand verraten, warum mein Code nicht funktioniert?

    @Iptzhiernur:
    Jetzt habe ich es verstanden. Ich dachte zunächst, dass Dein Code die einzelnen Dateien auflistet, nicht die Verzeichnisse. Nachdem ich den Code zwei-dreimal (10x :rolleyes: ) durchgelsen und im Geiste nachgegangen bin, ist mir die Funktionsweise aber klar, jetzt muss ich nur noch die Zeile, in der die Verzeichnisse in die ListBox eingetragen werden ersetzten durch eine Zeile, die alle entsprechenden Dateien einträgt, das kriege sogar ich hin. Vielen Dank.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TexMurphy“ ()

    TexMurphy schrieb:

    Kann mir denn auch jemand verraten, warum mein Code nicht funktioniert?


    ... und merke dir "funktioniert nicht" ist keine ausreichende Fehlerbeschreibung, wir können nicht hellsehen was du bei dir fabriziert hast. Also wenn etwas nicht funktioniert, gibst du deinen Code oder Codeausschnitt mit an und ebenfalls eine Fehlerausgabe sofern diese vom Debugger gemeldet wird.
    @Dodo
    Aber das habe ich doch im ersten Post getan ?(

    @Iputzhiernur

    Ich habe Deine Zeile, in der die Verzeichnisse in der Lisbox ausgegeben werden, folgendermaßen ersetzt:

    Quellcode

    1. Dim strliste() As String = Directory.GetFiles(strAlleOrdner(i), "*.inp", SearchOption.TopDirectoryOnly)
    2. For y As Integer = 1 To strliste.Count - 1
    3. lbDateien.Items.Add(strliste(y))
    4. Next y


    So funktioniert es. *freu*

    TexMurphy schrieb:

    Learning by doing sozusagen.

    das ist beim Umstieg auf .Net super-Kontraproduktiv.
    In .Net kannste alles gelernte aus VB5 vergessen, aber leider geht der Schrott noch. Daher, wenn du dir nicht systematisch Grundwissen zulegst, wirst du immer weiter Schrott reproduzieren.

    also dieses Buch Lesen - nicht das von Galileio-Press.

    Gleich ein Beispiel, warum deine Lösung - freu - auch Schrott ist: Du fängst den Zähler bei 1 an, in .Net ist das erste Element einer Auflistung aber bei 0.

    mal richtig effizient gecodet:

    VB.NET-Quellcode

    1. lbDateien.DataSource=Directory.GetFiles(strAlleOrdner(i), "*.inp", SearchOption.TopDirectoryOnly)
    mehr muss und sollte es nicht sein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Dodo schrieb:

    Ansonsten ist der Code von Rod nicht optimal, weil es Verzeichnisse geben kann auf die man keinen Zugriff hat, wie z.B. System Ordner.

    Genau deswegen habe ich "C:\Temp" als Pfad angegeben. Dort legt das System üblicherweise keine eigenen gesperrten Verzeichnisse rein. :thumbsup: :thumbsup: :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!