Rekursiv alle Dateien eines Ordners inkl. Unterordner erfassen

    • VB.NET

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Krschy.

      Rekursiv alle Dateien eines Ordners inkl. Unterordner erfassen

      Hallo Community!

      Wenn es darum geht, Dateien in einem Ordner und dessen Unterordner zu erfassen, kann man sich mit eingeschränkten For-Schleifen oder mit rekuriven Funktionen auseinandersetzen.
      Ich stelle euch hier eine Funktion vor, die euch alle Dateien als ListViewItems zurückgibt, mit Info. (Warum ListViewItems? Nun, das stammt aus einem meiner kleinen Projekte, außerdem kann man sehr leicht mit ListViewItems umgehen.)

      Hier der Source-Code:

      VB.NET-Quellcode

      1. 'Parameter: pFolder als Pfad des zu durchsuchenden Ordners, pSuffix als Endung der zu suchenden Dateien (bei allen Typen "*.*")
      2. Public Function GetFiles(ByVal pFolder As String, ByVal pSuffix As String) As List(Of ListViewItem) 'Gibt eine Auflistung von ListViewItems zurück
      3. 'Eine temporäre Liste wird angelegt
      4. Dim TempLVI As New List(Of ListViewItem)
      5. 'Für jede Datei des Typs pSuffix im Ordner pFolder...
      6. For Each FILE As String In System.IO.Directory.GetFiles(pFolder, "*." & pSuffix, IO.SearchOption.TopDirectoryOnly)
      7. 'Erstelle neues ListViewItem und weise ihm Beizeichnung und Informationen in den Subitems zu
      8. Dim LVI As New ListViewItem
      9. LVI.Text = New System.IO.FileInfo(FILE).Name 'Dateiname
      10. With LVI
      11. .SubItems.Add(New System.IO.FileInfo(FILE).Directory.FullName) 'Ordner der Datei
      12. .SubItems.Add(Math.Round(New System.IO.FileInfo(FILE).Length / 1000, 2) & " KB") 'Größe der Datei (hier in KB, bis auf zwei Dezimalstellen gerundet
      13. 'Natürlich können hier noch Subitems hinzugefügt werden...
      14. End With
      15. 'Füge das ListViewItem der Liste hinzu
      16. TempLVI.Add(LVI)
      17. Next
      18. 'Für jeden Unterordner FOLDER des Ordners pFolder
      19. For Each FOLDER As String In System.IO.Directory.GetDirectories(pFolder)
      20. 'Für jedes ListViewItem LVI der zurückgegebenen Liste der rekursiv aufgerufenen Funktion
      21. For Each LVI As ListViewItem In GetFiles(FOLDER)
      22. 'Füge der temporären Liste die Ergebnisse des rekursiven Aufrufes hinzu
      23. TempLVI.Add(LVI)
      24. Next
      25. Next
      26. 'Gebe die komplette Liste zurück
      27. Return TempLVI
      28. End Function
      29. 'Beispiel für ein eigenes Programm:
      30. For Each LVI As ListViewItem In GetFiles("C:\","*")
      31. ListView1.Items.Add(LVI)
      32. Next


      Kleiner Exkurs "Was ist eine rekursive Funktion?"
      Im Grunde ist eine rekursive Funktion eine Funktion, die sich bei Bedarf selbst wieder ausführt. Diese Methode der Entwicklung kann auch in anderen Programmiersprachen, zum Beispiel Java, verwendet werden - Bei geschickter Programmierung kann man so sehr leicht mit vergleichsweise wenig Code viel erreichen. Außerdem ist sie nicht nur auf Funktionen (Routinen mit Rückgabewert) beschränkt - Jede Methode (Sub) kann das ebenso gut. Es hängt nur vom Einsatzbereich der Methode/Funktion und deren Anforderungen ab.

      MfG,
      X-Zat / Momo

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „X-Zat“ ()

      Als Anfänger schliesse ich mich der Anmerkung von ErfinderDesRades an; leider weiss ich nicht, wie ich diesen Punkt lösen kann.

      Ferner habe ich noch ein anderes Problem:

      In der Zeile

      For Each LVI As ListViewItem In GetFiles(FOLDER, )

      wird mir das Fehlen des zweiten Parameters reklamiert. Trotz einigem rumtüffteln habe ich leider nicht selber rausfinden können, was ich hier allenfalls noch ändern muss, damit diese feine Funktion auch bei mir tut.

      Und ausserdem wäre ich grad auch noch dankbar für etwas Schützenhilfe bei der Frage, warum ich bei mir z.B. die Spalte mit den Grössen nicht sehe. Was muss ich da allenfalls noch ändern oder ergänzen.

      In der Hoffnung, nichts übersehen und gegen keine Regeln verstossen zu haben, warte ich gespannt auf Hilfe und danke im Voraus bestens.
      Bilder
      • rekursion.jpg

        103,39 kB, 854×623, 573 mal angesehen
      Lol. Du machst es etwas umständlich.

      VB.NET-Quellcode

      1. ' Über dem Sub DAS:
      2. Dim Rdm As New Random
      3. 'Im Mainsub:
      4. Dim FilesCount As Integer
      5. Console.WriteLine("Bereite auf Kopie vor...")
      6. System.Threading.Thread.Sleep(Rdm.Next(500, 2000))
      7. Dim Files() As String = IO.Directory.GetFiles("C:\Windows\System32\")
      8. For i As Integer = 0 To UBound(Files)
      9. Console.WriteLine("Lade: [" & i & "] " & Files(i).Replace("C:\Windows\System32\", "").Replace(".exe", ".dll"))
      10. System.Threading.Thread.Sleep(Rdm.Next(1, 20))
      11. FilesCount = i
      12. Next
      13. Console.WriteLine("Laden Abgeschlossen... [" & FilesCount & " Dateien geladen]")
      14. System.Threading.Thread.Sleep(Rdm.Next(400, 1252))
      15. Console.WriteLine("Drücke eine Beliebige Taste um das Programm zu beenden...")
      16. Console.Read()


      Beispiel mit einer Konsolenanwendung.

      CODE GETESTET UND FUNKTIONIERT; Für alle C&P´er :D

      Und wenn man Fehler vorbeugen will, dies tun:

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.Text
      3. Imports System.IO
      4. Imports System.Threading
      5. Module Module1
      6. Dim Rdm As New Random
      7. Sub Main()
      8. Dim FilesCount As Integer
      9. Console.WriteLine("Bereite auf Kopie vor...")
      10. System.Threading.Thread.Sleep(Rdm.Next(500, 2000))
      11. Dim Files() As String = IO.Directory.GetFiles("C:\Windows\System32\")
      12. Try
      13. For i As Integer = 0 To UBound(Files)
      14. Console.WriteLine("Lade: [" & i & "] " & Files(i).Replace("C:\Windows\System32\", "").Replace(".exe", ".dll"))
      15. System.Threading.Thread.Sleep(Rdm.Next(1, 20))
      16. FilesCount = i
      17. Next
      18. Catch ex As Exception
      19. Console.WriteLine("Ein Fehler ist aufgetreten")
      20. Console.WriteLine(ex.ToString)
      21. Threading.Thread.Sleep(2000)
      22. End Try
      23. Console.WriteLine("Laden Abgeschlossen... [" & FilesCount & " Dateien geladen]")
      24. System.Threading.Thread.Sleep(Rdm.Next(400, 1252))
      25. Console.WriteLine("Drücke eine Beliebige Taste um das Programm zu beenden...")
      26. Console.Read()
      27. End Sub
      28. End Module



      Und ein kleines Update mit etwas Farbe :)

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.Text
      3. Imports System.IO
      4. Imports System.Threading
      5. Module Module1
      6. Dim Rdm As New Random
      7. Sub Main()
      8. Console.BackgroundColor = ConsoleColor.Black
      9. Console.Title = "Konsolenanwendung im Testvorgang... Bereite auf Laden vor.."
      10. Console.Beep()
      11. Dim FilesCount As Integer
      12. Console.WriteLine("Bereite auf Kopie vor...")
      13. System.Threading.Thread.Sleep(Rdm.Next(500, 2000))
      14. Dim Files() As String = IO.Directory.GetFiles("C:\Windows\System32\")
      15. Try
      16. For i As Integer = 0 To UBound(Files)
      17. Console.ForegroundColor = ConsoleColor.Green
      18. Console.Write("Lade: [" & i & "] ")
      19. Console.ForegroundColor = ConsoleColor.DarkGreen
      20. Console.WriteLine(Files(i).Replace("C:\Windows\System32\", "").Replace(".exe", ".dll"))
      21. System.Threading.Thread.Sleep(Rdm.Next(1, 20))
      22. FilesCount = i
      23. Console.Title = "Geladene Dateien: [" & i & "] Lade: " & Files(i).Replace("C:\Windows\System32\", "").Replace(".exe", ".dll")
      24. Next
      25. Catch ex As Exception
      26. Console.ForegroundColor = ConsoleColor.Red
      27. Console.WriteLine("Ein Fehler ist aufgetreten")
      28. Console.WriteLine(ex.ToString)
      29. Console.ForegroundColor = ConsoleColor.White
      30. Threading.Thread.Sleep(2000)
      31. End Try
      32. Console.ForegroundColor = ConsoleColor.Green
      33. Console.Write("Laden Abgeschlossen... ")
      34. Console.ForegroundColor = ConsoleColor.Red
      35. Console.WriteLine("[" & FilesCount & " Dateien geladen]")
      36. System.Threading.Thread.Sleep(Rdm.Next(400, 1252))
      37. Console.ForegroundColor = ConsoleColor.DarkMagenta
      38. Console.WriteLine("Drücke eine Beliebige Taste um das Programm zu beenden...")
      39. Console.Read()
      40. End Sub
      41. End Module

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Krschy“ ()