Via Treeview - Verzeichnis durchsuchen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Immortel.

    Via Treeview - Verzeichnis durchsuchen

    Hallo Zusammen,
    Ich habe da ein kleines Problem im Bezug mit Treeview und dem Auslesen eines Verzeichnisses.
    Ich habe hier schon einen Code erstellt, mit dem ich in der Lage bin,
    die ersten Ordner des angegebenen Verzeichnisses und deren Dateien im Treeviewer anzeigen zu lassen.
    Leider habe ich noch keine kurze möglichkeit gefunden, auch die Unterverzeichnisse mit anzeigen zu lassen.

    Hier in diesem beispiel existiert ein Ordner unter "C:\Test\". Dort gibt es .txt dateien
    und auch unterordner Ordner1, Ordner2 und darunter Ordner1.1, Ordner1.2, Ordner2.1 .... usw.
    Er zeigt mir aber halt nur Ordner1, Ordner2 und die darin enthaltenen Dateien an, aber nicht die Unterordner.

    Jetzt habe ich gelesen, das ich mit einer Rekursiven abfrage weiter kommen soll.
    Soweit wie ich es verstanden habe, geht man hin und lässt die For Each Schleife(ob es Ordner gibt) so lange durchlaufen,
    bis es tatsächlich keine Unterverzeichnisse mehr gibt und mit dem selben Prinzip im anschluss dann die Dateien auslesen.

    Allerdings habe ich bisher noch kein schönes Beispiel gefunden, wo es gut erklärt ist, wie genau das Funktioniert.
    Habt ihr eine Idee, eine gute erklärung oder ein Schönes Code Beispiel?
    Oder muss ich sogar nur an meinem Jetztigen Code eine kleinigkeit umändern?

    Ich bin euch für jeden Tipp Dankbar

    Mit freundlichen Grüßen Euer Immortel

    hier mein Quellcode:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. ' Alle Verzeichnise auslesen, Pfadangabe anpassen !!!
    5. Dim dirs As String() = Directory.GetDirectories("C:\Test\")
    6. For Each dir As String In dirs
    7. ' Alles vor dem letzen "\" wegschneiden
    8. Dim dirName As String = dir
    9. If dirName.Contains("\") Then
    10. dirName = dirName.Substring(dirName.LastIndexOf("\") + 1)
    11. End If
    12. ' Node für das TreeView
    13. Dim node As New TreeNode(dirName)
    14. ' Alle Dateien im Verzeichnis
    15. Dim files As String() = Directory.GetFiles(dir)
    16. For Each file As String In files
    17. ' Die pfad Angabe von Dateinamen wegschneiden
    18. Dim fileName As String = file
    19. If fileName.Contains("\") Then
    20. fileName = fileName.Substring(fileName.LastIndexOf("\") + 1)
    21. End If
    22. ' SubNode
    23. Dim childNode As New TreeNode(fileName)
    24. ' SubNode hinzufügen
    25. node.Nodes.Add(childNode)
    26. Next
    27. ' Node zum TreeView hinzufügen
    28. Me.TreeView1.Nodes.Add(node)
    29. Next
    30. End Sub
    31. End Class

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

    VB.NET-Quellcode

    1. Dim di As New IO.DirectoryInfo(Path)
    2. ' alle jeweiligen Unterverzeichnisse durchsuchen
    3. Dim Dirs() As IO.DirectoryInfo = di.GetDirectories()
    4. For Each DirX As IO.DirectoryInfo In Dirs
    5. If (DirX.Attributes And IO.FileAttributes.Directory) = IO.FileAttributes.Directory Then
    6. ' etwas tun
    7. End If
    8. Next
    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!
    Hi

    ich glaube ROD's Vorschlag hilft dir bei deiner Frage kaum weiter.
    Du benötigst, wie du schon richtig erwähnt hast eine sogenannte "sich selbst aufrufende Prozedur", genannt Rekursion.

    Für dein Beispiel will ich dir nicht alles abnehmen, aber ein Beispiel geben, wie du alle Ordner (also Ohne Dateien) in dein Treeview mit Hilfe der ominösen Rekursion auflisten kann:

    VB.NET-Quellcode

    1. Sub.. myBase.load
    2. Dim tn0 As TreeNode = New TreeNode 'dies ist unser ROOTNode
    3. tn0.Text = "D:" 'bei meinem Bsp Laufwerk D
    4. Rec(tn0, "D:\") 'Nun wird mit dem Rootelement und dem Pfad gestartet die Rekursion gestartet
    5. TreeView1.Nodes.Add(tn0) 'Nach der Rekursion hängen alle Nodes am Rootnode und werden dem Treeview hinzugefügt
    6. TreeView1.CollapseAll()
    7. End Sub
    8. Private Sub Rec(ByVal tnode As TreeNode, ByVal DirPath As String) Es wird immer der Parent Node und der PFad übergeben, damit kann man alle Nodes an die richtige Stelle hängen
    9. For Each direct As String In Directory.GetDirectories(DirPath) 'Für jedes Unterverzeichnis im Order fügen wir wieder ein Treenode an
    10. Dim tn As New TreeNode
    11. tn.ImageKey = "Folder" 'Dies kannst du weglassen, falls du keine ImageList benötigst
    12. Dim di As DirectoryInfo = New DirectoryInfo(direct)
    13. If Not di.Name = "System Volume Information" Then 'System Volume Information möchte ich weglassen
    14. tn.Text = di.Name 'mit Namen des Ordners
    15. tn.Tag = di.FullName 'und im Tag den Pfad (das ist optional), kann aber später nützlich sein, den kompletten Pfad für jeden Ordner leicht lesen zu können
    16. Rec(tn, tn.Tag) 'Für jeden Unterordner rufen wir es wieder auf, bis keine Unterordner mehr vorhanden sind
    17. tnode.Nodes.Add(tn) 'Am Ende werden alle Subnodes mit deren Subnodes usw an den ersten Parent gehangen
    18. End If
    19. Next
    20. End Sub
    Das ist meine Signatur und sie wird wunderbar sein!
    Ey Klasse,
    Danke dir Mono ;-)!
    Vor allem auch für die Gute Erklärung dabei.

    Directory abfrage funktioniert jetzt Super, so wie es sein sollte.
    Muss jetzt nur noch die Files(Dateien) in den Jeweiligen Verzeichnissen anzeigen lassen und es ist Vollendet ;-)!

    Danke euch alle
    Euer Immortel

    PS: was würde man nur ohne dieses Forum machen ;)

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

    Alternativ hätten wir da einen Queue im Angebot (ohne Rekursion):

    VB.NET-Quellcode

    1. Dim q As New Queue(Of String)
    2. dim currdir As String
    3. q.Enqueue(Startdir)
    4. Do Until q.Count = 0
    5. currdir = q.Dequeue()
    6. For Each subdir As String In IO.FileSystem.GetDirectories(currdir)
    7. q.Enqueue(subdir)
    8. 'Und halt dem Treeview an currdir im TreePath einen Hinzufügen
    9. Next
    10. For Each file As String In IO.FileSystem.GetFiles(currdir)
    11. 'Nur ein Element hinzufügen bzw. z.B. zur "Dateiliste" hinzufügen
    12. Next
    13. Loop
    14. Loop