Textdatein nach Schlagwort am Zeilenanfang durchsuchen

  • VB.NET

Es gibt 84 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Hey Hey,
    also das mit der Problematik beim Objekt leuchtet mir jetzt ein. Danke.
    Funktioniert auch jetzt mit .To String.
    Dann düfte er sich ja jetzt nicht mehr aufhängen bei dem Suchlauf.

    Dann zu nächsten Frage:

    Es sind insgesamt 15 verschiedene Ordner in denen jeweils ca. 10000 Dateien sind, verteilt auf 8 verschiedene Netzwerke.
    Das ist das Spektrum was durchsucht werden muss.
    Er braucht dafür schon ne gewisse Zeit und man merkt dass er halt schwer arbeitet.

    Ist das vielleicht zuviel für mein kleines Tool?


    Edit:
    gerade versucht, das Tool hängt sich auf auf dem Rechner auf der Arbeit. Auf meinen Laptop funktioniert das Top.
    jemand ne Idee?

    Edit 2:
    Hab die Suchfunktion jetzt nur auf 10.000 Textdateien beschränkt und er macht es. Es dauert halt recht lange.
    Vielleicht setzt ich einfach ne MsgBox davor in der Zeit in der er sucht. Das andere Leute die damit arbeiten sich nicht wundern dass es so lange dauert.

    Bin dankbar für Vorschläge eurer Seite, ihr habt da ja wesentlich mehr Ahnung als ich.

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

    Kannst mal versuchen ob das schneller ist

    *Edit*
    Damit hab ich die besten Ergebnisse (getestet mit 10000 Dateien == 20000000 Zeilen).
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim scanThread As New System.Threading.Thread(Sub() ScanFiles(New DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "testFolder"))))
    2. scanThread.Start()


    VB.NET-Quellcode

    1. Private Sub ScanFiles(targetPath As DirectoryInfo)
    2. Dim fiAllFiles As FileInfo() = targetPath.GetFiles("*.txt", SearchOption.AllDirectories)
    3. Dim containingFiles As New List(Of String)()
    4. progressBar1.Invoke(New MethodInvoker(Sub() progressBar1.Maximum = fiAllFiles.Length))
    5. For Each fi As FileInfo In fiAllFiles
    6. For Each line As String In File.ReadLines(fi.FullName)
    7. If line <> "" AndAlso line.TrimStart().StartsWith("75") Then
    8. 'listBox1.Invoke(new MethodInvoker(delegate() { listBox1.Items.Add(Path.GetFileNameWithoutExtension(fi.FullName)); }));
    9. containingFiles.Add(Path.GetFileNameWithoutExtension(fi.Name))
    10. End If
    11. Next
    12. progressBar1.Invoke(New MethodInvoker(Sub() progressBar1.Increment(1)))
    13. Next
    14. listBox1.Invoke(New MethodInvoker(Sub() listBox1.Items.AddRange(containingFiles.ToArray())))
    15. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fakiz“ ()

    VB.NET-Quellcode

    1. private sub SuchenButton_Click(...)
    2. Dim scanThread As New System.Threading.Thread(Sub() ScanFiles(New DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "testFolder"))))
    3. scanThread.Start()
    4. End sub


    Du bruachst halt wenn du das 1 zu 1 übernehmen willst noch eine Progressbar.
    Danke danke,
    ist ja 1000 mal schneller als der Code zuvor.

    Ich muss halt jetzt versuchen noch paar Sachen anzupassen.
    Progressbar funktioniert auch top.

    jetzt muss ich nur noch rausfinden wo ich Festlege welchen welchen Pfad er für welche Listbox benutzen soll.
    Und dass er die 75 mit dem Schalgwort aus txtsuchenVS verbinde.
    also dass er alle ordner die ich ihm sage danach durchsucht.

    So ganz habe ich den Code nämlich nicht verstanden.
    Dim fiAllFiles As FileInfo() = targetPath.GetFiles("*.txt", SearchOption.AllDirectories)
    Hier werden alle Dateien in ein Array vom Typ FileInfo geschoben.

    Dim containingFiles As New List(Of String)()
    In diese Generische Liste werden alle Dateinamen verschoben in der eine Zeile die mit 75 beginnt verschoben. Durch das zwischen speichern in der liste bekommst du mehr Geschwindigkeit da die Listbox nicht ständig neu gemalt werden muss.

    progressBar1.Invoke(New MethodInvoker(Sub() progressBar1.Maximum = fiAllFiles.Length))
    Hier wird das Maximum der Progressbar auf die Anzahl der Dateien festgelegt

    For Each fi As FileInfo In fiAllFiles
    Hier wird das FileInfo -Array durchlaufen also jede ermittelte Datei.

    For Each line As String In File.ReadLines(fi.FullName)
    Die Datei wird Zeilenweise ausgelesen

    If line <> "" AndAlso line.TrimStart().StartsWith("75") Then
    Mit if line <> "" wird gefragt ob die Zeile über einen Text verfügt also keine Leerzeile ist. Verfügt die Zeile über einen Text wird mit .TrimStart() jedes Leerzeichen am Anfang der Zeile entfernnt und im Anschluss geprüft ob die Zeile mit 75 beginnt.

    containingFiles.Add(Path.GetFileNameWithoutExtension(fi.Name))
    PathGetFileNameWithoutExtension bereitet den Dateinamen auf. Es wird also nur noch der reine Dateiname in die Generische Liste containingFiles hinzugefügt.

    progressBar1.Invoke(New MethodInvoker(Sub() progressBar1.Increment(1)))
    Nach dem die Datei abgearbeitet wurde wird das ProgressbarValue Incrementiert.

    listBox1.Invoke(New MethodInvoker(Sub() listBox1.Items.AddRange(containingFiles.ToArray())))
    Wenn alle Dateien abgearbeitet wurden wird die Liste der Listbox übergeben.
    super, versteh ich.
    viel dank dafür.

    wie bekomm ich jetzt rein dass er mir nur die Dateien auflistet in der eine 75 am Anfang steht zusammen mit dem Schlagwort aus der Richtextbox? wenn ich es nämlich verknüpfe wie in dem Code zuvor sagt er mir:
    ungültiger threadübergreifender Vorgang. Der Zugriff auf das Steuerelement txtsuchenVS erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
    Am besten du überarbeitest den Methodenkopf und übergibst den Suchbegriff dort.

    VB.NET-Quellcode

    1. Private Sub ScanFiles(targetPath As DirectoryInfo, searchPattern as String)
    2. ...
    3. End Sub


    Dann würde die Abfrage so aussehen
    If line <> "" AndAlso line.TrimStart().StartsWith(searchPattern) Then

    Und der Aufruf so
    Dim scanThread As New System.Threading.Thread(Sub() ScanFiles(New DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "testFolder"), "75 " & txtsuchenVS.Text)))

    Das muss eine Klammer weiter nach rechts.

    VB.NET-Quellcode

    1. Dim scanThread As New System.Threading.Thread(Sub() ScanFiles(New DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "testFolder")), "75 " & txtsuchenVS.Text))
    Dauert etwas, ich muss es 1 zu 1 abschreiben.

    VB.NET-Quellcode

    1. Private Sub Scanfiles(targetPath as DirectoryInfo, searchPattern as String)
    2. Dim fiALLFiles as FileInfo() = targetPath.Getfiles("*.dat", IO.SearchOption.AllDirectories)
    3. Dim containingFiles as New (of String)()
    4. Progressbar1.Invoke(New MethodInvoker(Sub() Progressbar1.Maximum = fiALLFiles.Length))
    5. For each fi as FileInfo in fi ALLFiles#
    6. For each line as String in File.ReadALLLines(fi.Fullname)
    7. If line <> "" AndAlso line.Trimstart().Startswith8searchPattern) Then
    8. containingFiles.Add(Path.GetFileNameWithoutExtension(fi.Fullname))
    9. End if
    10. Next
    11. Progressbar1.Invoke(New MethodInvoker(Sub() Progressbar1.Increment(1))))
    12. Next
    13. Listbox22.Invoke (New MethodInvoker (Sub() Listbox22.Items.AddrRange(containingFiles.toArray())))
    14. End Sub

    und das ist der Aufruf:

    VB.NET-Quellcode

    1. Private Sub btnsuchenVS_Click (Sender as Objekt, e as EventArgs) Handels btnsuchenVS.Click
    2. Dim scanthread as New System.Threading.Thread(Sub() SacnFiles (New DirectoryInfo(Path.Combine(Enviroment.SpecialFolder.Desktop), Pfadprg22)). "75 " & txtsuchenVS.Text))
    3. sacnThread.start()
    4. End Sub

    VB.NET-Quellcode

    1. SacnFiles (New DirectoryInfo(Path.Combine(Enviroment.SpecialFolder.Desktop), Pfadprg22)). "75 " & txtsuchenVS.Text

    den Bereich markiert er mir und schreibt:
    ungültiger threadübergreifender Vorgang. Der Zugriff auf das Steuerelement txtsuchenVS erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Gottric schrieb:

    ich muss es 1 zu 1 abschreiben.

    Absolut fehlerhaft ! Mach es richtig, oder laß es ! :thumbdown:
    Ich wollte deine code in eine Testanwendung testen, müßte aber erst rum korrigieren und das ist mir zu anstrengend.
    Ich muss es 1 zu 1 abschreiben weil ich die Anwendung auf meinem Laptop schreibe aber dort kein Internet habe.
    Bin über den Rechner auf der Arbeit online. geht jetzt leider nicht anders, ich bin ja der der geholfen bekommen will. Hätte ich die Möglichkeit zu kopieren hätte ich mir nicht die Mühe gemacht alles 1 zu 1 abzuschreiben.

    Was müsste denn korrigiert werden?
    Er zeigt mir keinen Fehler an und die Anwendung startet auch normal, nur beim starten der Suchfunktion bringt er oben genannten Fehler.