Datei in order mit unterorder durchsuchen Performance/geschwindigkeit

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

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

    Datei in order mit unterorder durchsuchen Performance/geschwindigkeit

    Hallo,
    ich suche eine Datei die sich in einen Order mit vielen Unterordnern befindet... derzeitig lese ich es wie folg aus ..

    VB.NET-Quellcode

    1. Private DataPath As String
    2. Private OrderID As String
    3. Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    4. Try
    5. For Each sFile As String In My.Computer.FileSystem.GetFiles(My.Settings.SearchURL, FileIO.SearchOption.SearchAllSubDirectories, OrderID & ".pdf")
    6. DataPath = sFile.ToString
    7. BackgroundWorker1.ReportProgress(1)
    8. Exit Sub
    9. Next
    10. BackgroundWorker1.ReportProgress(2)
    11. Catch ex As Exception
    12. MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    13. End Try
    14. End Sub
    15. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    16. Select Case e.ProgressPercentage
    17. Case 1
    18. Label2.ForeColor = Color.Green
    19. Label2.Text = "Kopie vorhanden"
    20. BackgroundWorker1.CancelAsync()
    21. Case 2
    22. Label2.ForeColor = Color.Red
    23. Label2.Text = "Kopie nicht vorhanden"
    24. BackgroundWorker1.CancelAsync()
    25. End Select
    26. End Sub



    aber das dauert manchmal echt eine halbe ewigkeit... gibts dort schnellere lösungen oder tipps wie ich dies beschleunigen kann ?


    LG.
    Marvin
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)
    Schon probiert ob das hier schneller ist? Dim files As IEnumerable(Of FileInfo) = New DirectoryInfo("C:\Users\Alexander\Desktop").GetFiles("test.txt", SearchOption.AllDirectories)
    Ansonsten mal in der WinAPI nachschauen.
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa364232(v=vs.85).aspx

    Achja, den My-Namespace sollte man nicht benutzen. (varaltet)
    Stattdessen bietet dir System.IO FileInfo und DirectoryInfo.
    Der My-Namespace ist unbedingt zu vermeiden, wenn möglich! Er ist oftmals langsam und VB spezifisch - also inkompatibel zu anderen .NET Sprachen (z.B. C#.Net).
    Es wird außerdem eine Collection zurückgegeben, die ALLE Dateinamen enthält. Wenn die erste Datei die richtige ist, wird trotzdem der gesamte Ordner gescannt. (ebenso bei der Methode GetFiles von @LaMiy)
    Vermeiden lässt sich das mit New DirectoryInfo("path").EnumerateFiles.

    ReportProgress sollte man nicht zum Zurückgeben des Ergebnisses missbrauchen!

    Hier stehen einige Tipps zum Benutzen des BackgroundWorkers.
    Es gibt extra eine Variable für das Ergebnis der DoWork Prozedur.

    Ein Catch 'Em All der Eceptions ist auch nicht so die feine Art. Wenn try catch, dann spezifische Exceptions abfangen. Alles andere erstmal werfen.

    So könnte es aussehen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. e.Result = New DirectoryInfo("pfad").EnumerateFiles("bla", SearchOption.AllDirectories).FirstOrDefault
    3. End Sub
    4. Private
    5. Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    6. If e.Error IsNot Nothing Then
    7. 'unbehandelte Exceptions werfen
    8. Throw e.Error
    9. Else
    10. If e.Cancelled Then
    11. 'Code wenn BGW Abgebrochen wurde
    12. Else
    13. 'e.Result kann benutzt werden
    14. If e.Result IsNot Nothing Then
    15. MessageBox.Show("file found: " & DirectCast(e.Result, FileInfo).FullName)
    16. Else
    17. MessageBox.Show("file not found")
    18. End If
    19. End If
    20. End If
    21. End Sub

    Möglicherweise kommst du nicht drum rum selber eine rekursive Methode zu basteln, weil bei ner System.UnauthorizedAccessException die gesamte Suche abgebrochen wird. Da müsste man dann die System.UnauthorizedAccessException selber fangen.
    Bin mir da nicht ganz sicher.
    Bitte keine Bilder von Visual Studio oder Code hier posten. Wenn in ein paar Monaten das Bild gelöscht ist, dann ist der Post für die Nachwelt nutzlos.
    Schreib einfach: ich bekomme X Exception in Zeile Y mit dazugehörigem VB.NET code in tags.
    (Der link ist sowieso unbrauchbar by the way...)
    So dann nocheinmal :P

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. e.Result = New DirectoryInfo("Z:\LizenenKunden\").EnumerateFiles("test.pdf", SearchOption.AllDirectories).FirstOrDefault
    3. End Sub
    4. Private
    5. Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    6. If e.Error IsNot Nothing Then
    7. 'unbehandelte Exceptions werfen
    8. Throw e.Error
    9. Else
    10. If e.Cancelled Then
    11. 'Code wenn BGW Abgebrochen wurde
    12. Else
    13. 'e.Result kann benutzt werden
    14. If e.Result IsNot Nothing Then
    15. MessageBox.Show("file found: " & DirectCast(e.Result, FileInfo).FullName)
    16. Else
    17. MessageBox.Show("file not found")
    18. End If
    19. End If
    20. End If
    21. End Sub




    Fehlercode in Zeile 16

    Quellcode

    1. Das Objekt des Typs "System.IO.FileSystemEnumerableIterator`1[System.IO.FileInfo]" kann nicht in Typ "System.IO.FileInfo" umgewandelt werden.

    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)

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

    Also Erstens ist es nicht Zeile 18.
    Es ist Zeile 16.

    Zweitens ist das nicht der Code, den du benutzt hast.
    Ist es so schwer code zu copy&pasten?

    Du hast vermutlich .FirstOrDefault weggelassen, trotzdem aber meine Version hier gepostet.
    Ideal wäre es, wenn du verstehen würdest was der Code macht und was die Exception bedeutet. Ich gebe zu, dass das eventuell ein bisschen zuviel verlangt ist.
    Benutze die Documentation um rauszufinden, was EnumerateFiles macht. Sobald du auf einen Begriff triffst (in diesem Fall: IEnumerable(T)-Schnittstelle), den du nicht verstehst, versuche es herauszufinden. Das kann sehr lange dauern, aber am Ende hat man sich es selber erarbeitet, was viel wert ist.
    sorry -_- ..



    ich habe .FirstOrDefault testweise weggelassen weil ich dort auch einen Fehler bekommen habe

    Quellcode

    1. "FirstOrDefault" ist kein Member von "System.Collections.Generic.IEnumerable(Of System.IO.FileInfo)".



    ich werd mal ein wenig stöbern was ich so drüber rausfinde !
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)