Unterordner mit einbeziehen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von xtts02.

    Unterordner mit einbeziehen

    Hallo,
    Ich habe in Vb08 eine ListBox1 in der ich alle Dateien aus MyDocuments & Unterordnern adden möchte.

    Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Try
    2. For Each DateienmitPfad As String In Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
    3. ListBox1.Items.Add(DateienmitPfad)
    4. Next


    Allerdings werden mit diesem Code halt nur die Dateien aus MyDocuments geaddet.


    Kann mir jemand sagen wie ich auch die Unterordner miteinbeziehen kann?

    Mfg Kevin.

    VB.NET-Quellcode

    1. For Each DateienmitPfad As String In Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),SearchOption.AllDirectories)
    2. ListBox1.Items.Add(DateienmitPfad)
    3. Next


    P.S.: vielleicht mal IntelliSense nutzen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Du kannst das ganze rekursiv durchgehen.
    Rekursion ist (falls du es nicht weißt), wenn eine Methode sich selbst aufruft. In dem Fall also mit dem Unterordner als Argument.
    Oder so wie jvbsl vorgeschlagen hat. ;)

    Viele Grüße, Phil.
    Schau dir die Überladungen an (statt TopLevel AllDirectories). Was aber ggf. so Problemen führen kann, ist, dass beim Auftreten eines Fehlers (z.B. fehlende Zugriffsrechte) die ganze Operation abbricht. Dafür könntest du dir eine rekursive Funktion programmieren - falls nötig.

    (2late)
    Wie es der Zufall will, hab ich sowas in der Art gestern für nen Freund geschrieben...
    Hier der Quellcode, ist eig. glasklar, sodass C&P ausnahmsweise kein Problem ist :D

    VB.NET-Quellcode

    1. Dim Directory As New IO.DirectoryInfo(FolderBrowserDialog1.SelectedPath)
    2. Dim allFiles As IO.FileInfo() = Directory.GetFiles("*.*", SearchOption.AllDirectories)
    3. Dim singleFile As IO.FileInfo
    4. For Each singleFile In allFiles
    5. RichTextBox1.AppendText(singleFile.ToString & vbNewLine)
    6. Next

    Du müsstest halt nur das RichTextBox1.etc... an deine Listbox anpassen ;)
    wie es der Zufall so will, habe ich das bereits schon längst geschrieben, nur dass ich keine extra Variable für die dateien und auch nicht für das Directory brauch...xD
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    aber wie's der zufall will, hat der kevin89 schon geschrieben, dass da (z.b. bei windoof vista / 7) probleme auftreten werden wegen der RECYCLE.BIN, System Volume Information, usw.

    poste ich also auch mal C&P :P

    VB.NET-Quellcode

    1. Private Function searchDir(ByVal path As String) As List(Of String)
    2. Dim paths As New Stack(Of String)
    3. Dim files As New List(Of String)
    4. paths.Push(path)
    5. While paths.Count > 0
    6. Dim dir As String = paths.Pop
    7. Try
    8. files.AddRange(IO.Directory.GetFiles(dir))
    9. Catch ex As Exception
    10. End Try
    11. Try
    12. For Each s As String In IO.Directory.GetDirectories(dir)
    13. paths.Push(s)
    14. Next
    15. Catch ex As Exception
    16. End Try
    17. End While
    18. Return files
    19. End Function


    rufst die funktion auf, übergibst das hauptverzeichnis als string (z.b. "C:\") und bekommst eine List(Of String) als ergebnis, die du dann weiterverarbeiten kannst.
    @lordknoblauch: Auch in XP bekommt man Probleme nicht wegen dem Recycle sondern wegen dem System Volume Information Ordner.

    @Samus Aran: Das funktioniert mit der SearchOption.AllDirectories nicht, weil wenn es keine Zugriffsrechte gibt wird die Forschleife den Fehler auswerfen und beendet. Heißt es bringt nichts die For in ein Try Catch zu packen. Try Catch kann man bei der Rekursiven Funktion nutzen.