Laufwerk(e) nach Dateien durchsuchen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Stefanxx3.

    Laufwerk(e) nach Dateien durchsuchen

    Heya,
    schon wieder ich :D

    Da ich mich vor kurzem mit ner Art "Scannern" beschäftige(recht neu im Gebiet :P ) kenne ich mich nicht wirklich gut aus.

    Ich will jetzt in einem bestimmten Laufwerk mehrere Dateien durchsuchen und nicht nur eine.

    Ich habe aus dem vb-archiv eine Klasse gefunden, die nach einer Datei sucht aber nicht nach mehreren.

    Habe deshalb versucht die Datei-Namen in einem Array zu speichern jedoch ohne erfolg(oder ich habe iwo verkackt)

    Hier mal die sources:
    Form1:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class Form1
    3. Inherits System.Windows.Forms.Form
    4. Dim f As SearchFile
    5. Private Sub Button1_Click(ByVal sender As System.Object, _
    6. ByVal e As System.EventArgs) Handles Button1.Click
    7. suchen()
    8. End Sub
    9. Private Sub suchen()
    10. Me.ListBox1.Items.Clear()
    11. Dim x As String = "profile.txt"
    12. ' Als Array war es so (enstprechend in der Module dann auch geändert)
    13. ' Dim x(1) As String
    14. ' x(0) = "profile.txt"
    15. ' x(1) = "version.ini"
    16. f = New SearchFile(x, "D:\", False)
    17. AddHandler f.CurrentFile, AddressOf CurrentFile
    18. f.Search()
    19. End Sub
    20. Private Sub CurrentFile(ByVal FileName As String, ByVal IsEqual As Boolean)
    21. Dim sPath As String = IO.Path.GetDirectoryName(FileName)
    22. If Label1.Text <> sPath Then
    23. Label1.Text = sPath
    24. Application.DoEvents()
    25. End If
    26. If IsEqual Then
    27. Me.ListBox1.Items.Add("Found: " + FileName)
    28. Application.DoEvents()
    29. End If
    30. End Sub
    31. Private Sub Button2_Click(ByVal sender As System.Object, _
    32. ByVal e As System.EventArgs) Handles Button2.Click
    33. f.Abort()
    34. End Sub
    35. End Class


    Module1:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Threading
    3. Imports System.Environment
    4. Imports System.Runtime
    5. Imports System.Runtime.InteropServices
    6. Imports System.ComponentModel
    7. Module Module1
    8. Public Class SearchFile
    9. Inherits Object
    10. Private m_FileName As String
    11. Private m_Log As Boolean
    12. Private m_Drives As String
    13. Private m_sw As IO.StreamWriter
    14. Private m_Abort As Boolean
    15. Public Event CurrentFile(ByVal FileName As String, ByVal IsEqual As Boolean)
    16. ' Vorgang abbrechen
    17. Public Sub Abort()
    18. Me.m_Abort = True
    19. End Sub
    20. ' Klassen-Initialisierung
    21. Public Sub New(ByVal FileName As String, ByVal Drives As String, ByVal Log As Boolean)
    22. MyBase.New()
    23. Me.m_FileName = FileName
    24. Me.m_Log = Log
    25. Me.m_Drives = Drives
    26. End Sub
    27. ' Suchvorgang starten
    28. Public Sub Search()
    29. Try
    30. Me.m_Abort = False
    31. If Me.m_Log Then m_sw = New IO.StreamWriter("log.txt", False)
    32. For Each d As String In Me.m_Drives
    33. Me.Search(d)
    34. If Me.m_Abort Then Return
    35. Next
    36. Finally
    37. If Not m_sw Is Nothing Then
    38. m_sw.Close()
    39. End If
    40. End Try
    41. End Sub
    42. ' aktuelle Datei in LogFile speichern
    43. Private Sub Log(ByVal CurrentFile As String)
    44. If Not Me.m_Log Then Return
    45. m_sw.WriteLine(CurrentFile)
    46. End Sub
    47. ' Vergleich, ob es sich bei der aktuellen
    48. ' Datei um die gesuchte Datei handelt
    49. Private Sub IsEqual(ByVal CurrentItem As String)
    50. RaiseEvent CurrentFile(CurrentItem, _
    51. Me.m_FileName.ToUpper.Equals(IO.Path.GetFileName(CurrentItem).ToUpper))
    52. End Sub
    53. ' Verzeichnis durchsuchen
    54. Private Sub SearchFile(ByVal Dir As String)
    55. For Each f As String In IO.Directory.GetFiles(Dir)
    56. Me.Log(f)
    57. Me.IsEqual(f)
    58. If Me.m_Abort Then Return
    59. Next
    60. End Sub
    61. ' alle Verzeichnisse ermitteln und Suchvorgang ausführen
    62. Private Sub Search(ByVal Dir As String)
    63. Try
    64. SearchFile(Dir)
    65. For Each d As String In IO.Directory.GetDirectories(Dir)
    66. Try
    67. If Me.m_Abort Then Return
    68. Search(d)
    69. Catch ex As Exception
    70. Debug.WriteLine(ex.Message)
    71. End Try
    72. Next
    73. Catch ex As Exception
    74. Debug.WriteLine(ex.Message)
    75. End Try
    76. End Sub
    77. End Class
    78. End Module


    Danke in vorraus und hoffe um Hilfe ! :)
    Grüße
    Was ist denn nun Dein Problem?
    Sollen wir für Dich den Grotten-Code zurechtbiegen oder was?
    Wenn Du Code gefunden hast, der eine Datei sucht, Du aber mehrere Dateien suchen willst, solltest Du den Code halt meehrmals aufrufen, mit immer einer anderen Datei.
    Wie sieht denn Dein Filenamen-Array aus?
    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!

    RodFromGermany schrieb:

    Wenn Du Code gefunden hast, der eine Datei sucht, Du aber mehrere Dateien suchen willst, solltest Du den Code halt meehrmals aufrufen, mit immer einer anderen Datei.
    Geht zwar aber er durchsucht doppelt bzw. mehrfach und nicht mit einer Durchsuchung mehrere Dateien.

    Wie sieht denn Dein Filenamen-Array aus?
    Steht ausdokumentiert im geposteten Code.

    Stefanxx3 schrieb:

    Steht ausdokumentiert im geposteten Code.
    Fein. Du greifst aber nicht drauf zu.
    Was sagt Dein Code zu Option Strict On?
    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!
    1. Ich vermisse das WithEvents bei

    VB.NET-Quellcode

    1. Dim f As SearchFile

    2. Wie äußert sich

    Stefanxx3 schrieb:

    Er ignoriert einfach die 2 Dateien, wenn ich diese suche
    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!
    zu 2. Naja, wie soll ich das am besten sagen.. Der Scanner findet die 2 Dateien die sich im Ordner befinden nicht. Sprich wenn der Scanner grad bei D:\Test\ ist(in meinem fall), findet/gibt er mir die 2 Dateien nicht aus, obwohl sie sich in diesem Ordner befinden..

    Hier mal der aktuelle Code:

    Form1:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class Form1
    3. Inherits System.Windows.Forms.Form
    4. Dim WithEvents f As SearchFile
    5. Private Sub Button1_Click(ByVal sender As System.Object, _
    6. ByVal e As System.EventArgs) Handles Button1.Click
    7. Dim t As New Threading.Thread(AddressOf suchen)
    8. t.Start()
    9. End Sub
    10. Private Sub suchen()
    11. Me.ListBox1.Items.Clear()
    12. Dim x(1) As String
    13. x(0) = "profile.txt"
    14. x(1) = "version.ini"
    15. f = New SearchFile(x, System.Environment.GetLogicalDrives, True)
    16. AddHandler f.CurrentFile, AddressOf CurrentFile
    17. f.Search()
    18. End Sub
    19. Private Sub CurrentFile(ByVal FileName As String, ByVal IsEqual As Boolean)
    20. Dim sPath As String = IO.Path.GetDirectoryName(FileName)
    21. If Label1.Text <> sPath Then
    22. Label1.Text = sPath
    23. Application.DoEvents()
    24. End If
    25. If IsEqual Then
    26. Me.ListBox1.Items.Add("Found: " + FileName)
    27. Application.DoEvents()
    28. End If
    29. End Sub
    30. Private Sub Button2_Click(ByVal sender As System.Object, _
    31. ByVal e As System.EventArgs) Handles Button2.Click
    32. f.Abort()
    33. End Sub
    34. Private Sub Form1_FormClosed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
    35. Try
    36. IO.File.Delete("./log.txt")
    37. Catch ex As Exception
    38. MsgBox(ex.Message)
    39. End Try
    40. End Sub
    41. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    42. Me.ListBox1.CheckForIllegalCrossThreadCalls = False
    43. End Sub
    44. End Class


    Module1:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Threading
    3. Imports System.Environment
    4. Imports System.Runtime
    5. Imports System.Runtime.InteropServices
    6. Imports System.ComponentModel
    7. Module Module1
    8. Public Class SearchFile
    9. Inherits Object
    10. Private m_FileName() As String
    11. Private m_Log As Boolean
    12. Private m_Drives() As String
    13. Private m_sw As IO.StreamWriter
    14. Private m_Abort As Boolean
    15. Public Event CurrentFile(ByVal FileName As String, ByVal IsEqual As Boolean)
    16. ' Vorgang abbrechen
    17. Public Sub Abort()
    18. Me.m_Abort = True
    19. End Sub
    20. ' Klassen-Initialisierung
    21. Public Sub New(ByVal FileName() As String, ByVal Drives() As String, ByVal Log As Boolean)
    22. MyBase.New()
    23. Me.m_FileName = FileName
    24. Me.m_Log = Log
    25. Me.m_Drives = Drives
    26. End Sub
    27. ' Suchvorgang starten
    28. Public Sub Search()
    29. Try
    30. Me.m_Abort = False
    31. If Me.m_Log Then m_sw = New IO.StreamWriter("log.txt", False)
    32. For Each d As String In Me.m_Drives
    33. Me.Search(d)
    34. If Me.m_Abort Then Return
    35. Next
    36. Finally
    37. If Not m_sw Is Nothing Then
    38. m_sw.Close()
    39. End If
    40. End Try
    41. End Sub
    42. ' aktuelle Datei in LogFile speichern
    43. Private Sub Log(ByVal CurrentFile As String)
    44. If Not Me.m_Log Then Return
    45. m_sw.WriteLine(CurrentFile)
    46. End Sub
    47. ' Vergleich, ob es sich bei der aktuellen
    48. ' Datei um die gesuchte Datei handelt
    49. Private Sub IsEqual(ByVal CurrentItem As String)
    50. RaiseEvent CurrentFile(CurrentItem, _
    51. CStr(UBound(Me.m_FileName)).ToUpper.Equals(IO.Path.GetFileName(CurrentItem).ToUpper))
    52. End Sub
    53. ' Verzeichnis durchsuchen
    54. Private Sub SearchFile(ByVal Dir As String)
    55. For Each f As String In IO.Directory.GetFiles(Dir)
    56. Me.Log(f)
    57. Me.IsEqual(f)
    58. If Me.m_Abort Then Return
    59. Next
    60. End Sub
    61. ' alle Verzeichnisse ermitteln und Suchvorgang ausführen
    62. Private Sub Search(ByVal Dir As String)
    63. Try
    64. SearchFile(Dir)
    65. For Each d As String In IO.Directory.GetDirectories(Dir)
    66. Try
    67. If Me.m_Abort Then Return
    68. Search(d)
    69. Catch ex As Exception
    70. Debug.WriteLine(ex.Message)
    71. End Try
    72. Next
    73. Catch ex As Exception
    74. Debug.WriteLine(ex.Message)
    75. End Try
    76. End Sub
    77. End Class
    78. End Module



    Edit: Ka wieso [vb] [./vb] keine gescheiten Absätze macht, ich hoffe man erkennt es trotzdem

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

    VB.NET-Quellcode

    1. Private Sub IsEqual(ByVal CurrentItem As String)
    2. RaiseEvent CurrentFile(CurrentItem, _
    3. CStr(UBound(Me.m_FileName)).ToUpper.Equals(IO.Path.GetFileName(CurrentItem).ToUpper))
    4. End Sub
    Dieser Befehl macht nicht das, was Du glaubst, was er tun soll:

    VB.NET-Quellcode

    1. CStr(UBound(Me.m_FileName)).ToUpper.Equals(IO.Path.GetFileName(CurrentItem).ToUpper)
    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!
    Mhm.

    Müsste also dann das FileName durchgehen, und dann das einzelne vergleichen oder ?

    Edit: Habs gelöst!

    VB.NET-Quellcode

    1. For Each file As String In Me.m_FileName
    2. RaiseEvent CurrentFile(CurrentItem, _
    3. file.ToUpper.Equals(IO.Path.GetFileName(CurrentItem).ToUpper))
    4. Next
    So isses. :thumbsup:
    Pack mal das ToUpper dahin, wo die Strings generiert bzw. gespeichert werden.
    Und:
    Schmeiß das Module / End Module raus.
    Sieh Dir mal das an, da wird nur ein Event geworfen:

    VB.NET-Quellcode

    1. Private Sub IsEqual(ByVal CurrentItem As String)
    2. Dim file As String = IO.Path.GetFileName(CurrentItem)
    3. Dim found As Boolean = False
    4. For Each ss As String In Me.m_FileName
    5. If ss = file Then
    6. found = True
    7. Exit For
    8. End If
    9. Next
    10. RaiseEvent CurrentFile(CurrentItem, found)
    11. 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!