Mehrere Dateien suchen und in ListBox ausgeben

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Mehrere Dateien suchen und in ListBox ausgeben

    Guten Morgen,

    ich möchte gerne mehrere bestimmte Dateien (bspw. 1.txt, 2.dat, 3.dll) auf allen Laufwerken suchen und die Pfade in eine ListBox1 eintragen.
    Wieviele Laufwerke der jeweilige Rechner hat, weiss ich vorher nicht. Lt. Google kann man das Problem anscheinend mit
    "System.Environment.GetLogicalDrives" lösen.

    Da ich absolute Anfängerin bin habe ich mit diesem Code "rumgespielt", weiss jetzt aber nicht weiter, wie ich die Laufwerke und die
    mehreren Dateien hier reinbasteln muss:

    Quellcode

    1. Dim sFile As String
    2. Dim sPath As String
    3. ' Startverzeichnis
    4. sPath = "C:\"
    5. ' alle Dateien im Startverzeichnis einschl. Unterordner
    6. ' in einer ListBox anzeigen
    7. For Each sFile In My.Computer.FileSystem.GetFiles(
    8. sPath, FileIO.SearchOption.SearchAllSubDirectories, "1.txt")
    9. ListBox1.Items.Add(sFile)
    10. Next


    Bei diesem Code kommt außerdem der Fehler "Der Zugriff auf Recycle.bin verweigert", wenn ich C:\ eintrage.
    Auf D:\ kommt der Fehler nicht. Hat das was mit Adminrechten zu tun?

    Vielen Dank und viele Grüße

    Simone

    Eierlikörchen schrieb:

    Hat das was mit Adminrechten zu tun?
    Jein.
    Gewisse Pfade darfst Du selbst als Administrator nicht "betreten".
    Wenn Du auf ein Verzeichnis zugreifst, musst Du diesen Zugriff mit Try/Catch umschließen und bei einer UnauthorizedAccessException einfach mit dem nächsten Verzeichnis weiter machen.
    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!
    Ja, und daraus folgt, dass du my.computer.filesystem.getfiles nicht verwenden kannst.
    Weil wenn das die UnAuthorisized wirft, kannste das zwar catchen, kannst aber nicht beim nächsten Verzeichnis weiter machen oder sowas.

    Also musste selbst eine rekursive Methode basteln, die die Ordner einzeln durchklappert, UnauthorizedAccessException catcht und weiter macht.
    Hier ist Ansätze dazu: Rekursive Dateisuche mit anonymer Methode
    Allerdings machen die nicht genau was du willst, aber ähnliches - musste halt Code verstehen und anpassen.
    Bei Fragen fragen - "wer nicht fragt bleibt dumm" (ist das Zitat eiglich noch bekannt?)

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

    Hallo ihr beiden,

    vielen Dank für Eure Denkanstöße, die ich sogar als Anfängerin nachvollziehen kann *stolzguck* :)

    Ich habe heute viel getestet und gebastelt. Außerdem habe ich nochmal Google bemüht und bin auf
    einen Code gestoßen der alles vereint was ich mir vorstelle >> Perfekt!
    Zwei Sachen fehlen nur:
    1) Ich möchte den Code so ändern, dass ich mehrere Dateien suchen kann und diese in der Listbox1 zusammengefasst werden.
    Am besten ca. fünf Textboxen.
    2) Es soll auch eine Wildcard funktionieren, bspw. *.txt in der Textbox.

    An welchen Stellschrauben muss ich ansetzen?

    Vielen Dank
    Simone

    Quellcode

    1. Public Class SearchFile
    2. Inherits Object
    3. Private m_FileName As String
    4. Private m_Log As Boolean
    5. Private m_Drives() As String
    6. Private m_sw As IO.StreamWriter
    7. Private m_Abort As Boolean
    8. Public Event CurrentFile(ByVal FileName As String, ByVal IsEqual As Boolean)
    9. ' Vorgang abbrechen
    10. Public Sub Abort()
    11. Me.m_Abort = True
    12. End Sub
    13. ' Klassen-Initialisierung
    14. Public Sub New(ByVal FileName As String, ByVal Drives() As String, ByVal Log As Boolean)
    15. MyBase.New()
    16. Me.m_FileName = FileName
    17. Me.m_Log = Log
    18. Me.m_Drives = Drives
    19. End Sub
    20. ' Suchvorgang starten
    21. Public Sub Search()
    22. Try
    23. Me.m_Abort = False
    24. If Me.m_Log Then m_sw = New IO.StreamWriter("log.txt", False)
    25. For Each d As String In Me.m_Drives
    26. Me.Search(d)
    27. If Me.m_Abort Then Return
    28. Next
    29. Finally
    30. If Not m_sw Is Nothing Then
    31. m_sw.Close()
    32. End If
    33. End Try
    34. End Sub
    35. ' aktuelle Datei in LogFile speichern
    36. Private Sub Log(ByVal CurrentFile As String)
    37. If Not Me.m_Log Then Return
    38. m_sw.WriteLine(CurrentFile)
    39. End Sub
    40. ' Vergleich, ob es sich bei der aktuellen
    41. ' Datei um die gesuchte Datei handelt
    42. Private Sub IsEqual(ByVal CurrentItem As String)
    43. RaiseEvent CurrentFile(CurrentItem,
    44. Me.m_FileName.ToUpper.Equals(IO.Path.GetFileName(CurrentItem).ToUpper))
    45. End Sub
    46. ' Verzeichnis durchsuchen
    47. Private Sub SearchFile(ByVal Dir As String)
    48. For Each f As String In IO.Directory.GetFiles(Dir)
    49. Me.Log(f)
    50. Me.IsEqual(f)
    51. If Me.m_Abort Then Return
    52. Next
    53. End Sub
    54. ' alle Verzeichnisse ermitteln und Suchvorgang ausführen
    55. Private Sub Search(ByVal Dir As String)
    56. Try
    57. SearchFile(Dir)
    58. For Each d As String In IO.Directory.GetDirectories(Dir)
    59. Try
    60. If Me.m_Abort Then Return
    61. Search(d)
    62. Catch ex As Exception
    63. Debug.WriteLine(ex.Message)
    64. End Try
    65. Next
    66. Catch ex As Exception
    67. Debug.WriteLine(ex.Message)
    68. End Try
    69. End Sub
    70. End Class
    71. ' Inherits System.Windows.Forms.Form
    72. Dim f As SearchFile
    73. Private Sub Button1_Click(ByVal sender As System.Object,
    74. ByVal e As System.EventArgs) Handles Button1.Click
    75. ' alle logischen LW nach der Datei durchsuchebn,
    76. ' die in der TextBox eingegeben wurde
    77. f = New SearchFile(TextBox1.Text, System.Environment.GetLogicalDrives, True)
    78. AddHandler f.CurrentFile, AddressOf CurrentFile
    79. f.Search()
    80. End Sub
    81. Private Sub CurrentFile(ByVal FileName As String, ByVal IsEqual As Boolean)
    82. ' Pfad extrahieren und im Label-Control anzeigen
    83. Dim sPath As String = IO.Path.GetDirectoryName(FileName)
    84. If Label1.Text <> sPath Then
    85. Label1.Text = sPath
    86. Application.DoEvents()
    87. End If
    88. ' Treffer der ListBox hinzufügen
    89. If IsEqual Then
    90. Me.ListBox1.Items.Add("Found: " + FileName)
    91. Application.DoEvents()
    92. ' Falls nach dem 1. Treffer der Vorgang abgebrochen
    93. ' werden soll, einfach die Abort-Methode aufrufen
    94. ' f.Abort()
    95. End If
    96. End Sub
    97. Private Sub Button2_Click(ByVal sender As System.Object,
    98. ByVal e As System.EventArgs) Handles Button2.Click
    99. ' Bei Klick auf den 2. Button, Vorgang abbrechen
    100. f.Abort()
    101. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eierlikörchen“ ()

    Eierlikörchen schrieb:

    An welchen Stellschrauben muss ich ansetzen?
    Im Form empfängst du ja das CurrentFile-Event.
    Das gibt dir das CurrentFile-Argument - da musst du schauen, ob es deinen Suchbedingungen entspricht oder nicht.
    Das Event liefert dir ausserdem ein IsEqual-Argument - das kannste vergessen - das macht für deine Belange keine sinnvolle Angabe.

    Deine Suchbedingungen sind nicht klar definiert. Du willst nach mehreren Files suchen, aber gleichzeitig auch auf mehrere File-Extensions filtern?
    wie stellst du dir das vor?

    Eierlikörchen schrieb:

    dass ich mehrere Dateien suchen kann
    Das geht nur, indem Du nacheinander jede Deiner Extensions durchklickerst.
    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!
    Ich habe jetzt fünf Textboxen platziert und lasse sie nacheinander durchlaufen.
    Funktioniert super!! :) Danke.

    Jetzt wäre es noch super, wenn ich in den Textboxen sehr flexibel bin.

    Also Test.txt oder *.txt oder *Test*.* sollen in der Listbox1 aufgelistet werden.
    Wo genau muss ich die Wildcard platzieren?

    Lieben Dank euch beiden

    Eierlikörchen schrieb:

    Wo genau muss ich die Wildcard platzieren?
    Spekulatius: Zeile 37 Spalte 18.
    Ansonsten poste mal Deinen Code.
    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!