From 3bb034439a19589cc9e0ee18ab061e26430a70e9 Mon Sep 17 00:00:00 2001 From: OlgunR Date: Thu, 27 Nov 2025 16:59:27 +0100 Subject: [PATCH] Fehlerbehandlung bei fehlerhaften Pfaden in DI Profilen: threadDateiimport_DoWork, Profil_Durchlauf, threadDateiimport_RunWorkerCompleted optimiert - frmDIHautpseite --- ToolCollection/frmDIHauptseite.vb | 105 +++++++++++++++++++----------- 1 file changed, 68 insertions(+), 37 deletions(-) diff --git a/ToolCollection/frmDIHauptseite.vb b/ToolCollection/frmDIHauptseite.vb index 4d086c9..20e2859 100644 --- a/ToolCollection/frmDIHauptseite.vb +++ b/ToolCollection/frmDIHauptseite.vb @@ -60,6 +60,7 @@ Public Class frmDIHauptseite Private CriticalErrorInBackgroundWorker As Boolean = False Private manProfile As String + Private FehlerProfileListe As New List(Of String) Private Alles_OK As Boolean = True @@ -268,7 +269,7 @@ Public Class frmDIHauptseite #End Region #Region "*** DoWork: während der BackgroundWorker aktiv ist ***" - Private Sub threadDateiimport_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) 'Handles threadDateiimport.DoWork + Private Sub threadDateiimport_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Dim _TimeStart As Date Dim _TimeEnd As Date Try @@ -283,9 +284,11 @@ Public Class frmDIHauptseite _TimeStart = Now ClassLoggerDI.Add(" Intervall: " & Me.numIntervallDurchlauf.Value, False) ClassLoggerDI.Add("======================================================================", False) - If _windream.Init Then + ' Liste für fehlerhafte Profile zurücksetzen + FehlerProfileListe.Clear() + If _windream.Init Then If Manuell = True Then ClassLoggerDI.Add(">> Manueller Durchlauf", False) ClassLoggerDI.Add("Profilname: " & manProfile, False) @@ -298,42 +301,51 @@ Public Class frmDIHauptseite '1. ###### Zählen der Files Gesamtfiles = 0 Dim files_Durchlauf As ReadOnlyCollection(Of String) - For Each item As ClassDIProfil In ClassDIProfile.Profile + For Each item As ClassDIProfil In ClassDIProfile.Profile Me.selectedProfile = ClassDIProfile.getProfilByName(item.OriginalProfilname) 'Nur die files der Aktiven Profile zählen If CBool(selectedProfile.Aktiv) = True Then - If Me.selectedProfile.Subdirectories = True Then - files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchAllSubDirectories, "*.*") - Else - files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*") - End If - 'files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*") - Gesamtfiles += files_Durchlauf.Count + Try + If Me.selectedProfile.Subdirectories = True Then + files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchAllSubDirectories, "*.*") + Else + files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*") + End If + Gesamtfiles += files_Durchlauf.Count + Catch ex As Exception + ' Profil zur Fehlerliste hinzufügen + FehlerProfileListe.Add(item.OriginalProfilname) + ClassLoggerDI.Add($"## FEHLER beim Zugriff auf Quellordner für Profil '{item.OriginalProfilname}': {ex.Message}", True) + End Try End If - - 'MsgBox(files_Durchlauf.Count, MsgBoxStyle.Information, item.OriginalProfilname) Next + ClassLoggerDI.Add("Gesamtanzahl der zu importierenden Dateien: " & Gesamtfiles, False) + If Gesamtfiles > 0 Then '2. Jetzt das Durchlaufen jedes Profiles For Each item As ClassDIProfil In ClassDIProfile.Profile Me.selectedProfile = ClassDIProfile.getProfilByName(item.OriginalProfilname) ClassLoggerDI.Add("Profilname: " & selectedProfile.Profilname, False) + ' Überprüfen ob Profil aktiv oder inaktiv If CBool(selectedProfile.Aktiv) = False Then ClassLoggerDI.Add(">> Profil: " & selectedProfile.Profilname & " ist inaktiv geschaltet", False) ClassLoggerDI.Add("", False) + ElseIf FehlerProfileListe.Contains(item.OriginalProfilname) Then + ' Profil überspringen, wenn es bereits als fehlerhaft markiert wurde + ClassLoggerDI.Add(">> Profil: " & selectedProfile.Profilname & " wird übersprungen (fehlerhafter Pfad)", False) + ClassLoggerDI.Add("", False) Else ' den Durchlaufszeitpunkt speichern selectedProfile.LastRun = Now selectedProfile.Save(False) - 'Und nun das PRofil durchlaufen + 'Und nun das Profil durchlaufen ClassLoggerDI.Add("- Start des Profildurchlaufes ", False) Profil_Durchlauf() End If - Next End If End If @@ -342,10 +354,9 @@ Public Class frmDIHauptseite End If '### Catch ex As Exception - ' 'MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei threadDateiimport_DoWork:") ClassLoggerDI.Add(" ## Fehler bei thread_DI_DoWork: " & ex.Message, False) - ' Resume Next End Try + _TimeEnd = Now Dim seconds As Integer = (_TimeEnd - _TimeStart).TotalSeconds @@ -358,8 +369,6 @@ Public Class frmDIHauptseite Else ClassLoggerDI.Add(" Dauer: " & (seconds / 60).ToString & " Minuten", False) End If - - End Sub Public Function func_check_file_use(ByVal filename) As Boolean filename = filename.Replace(My.Settings.vWLaufwerk, "\\windream\objects") @@ -426,11 +435,22 @@ Public Class frmDIHauptseite Dim oFileAusschlussList As New ArrayList 'Variable für das "Letzte Subdirectory" Dim oLastFolderinFiles As String = "" - If Me.selectedProfile.Subdirectories = True Then - Me.ImportFileList = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchAllSubDirectories, "*.*") - Else - Me.ImportFileList = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*") - End If + + Try + If Me.selectedProfile.Subdirectories = True Then + Me.ImportFileList = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchAllSubDirectories, "*.*") + Else + Me.ImportFileList = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*") + End If + Catch ex As Exception + ' Profil zur Fehlerliste hinzufügen, falls noch nicht vorhanden + If Not FehlerProfileListe.Contains(Me.selectedProfile.OriginalProfilname) Then + FehlerProfileListe.Add(Me.selectedProfile.OriginalProfilname) + End If + ClassLoggerDI.Add($"## FEHLER beim Zugriff auf Quellordner für Profil '{Me.selectedProfile.OriginalProfilname}': {ex.Message}", True) + Exit Sub + End Try + Dim oError As Boolean = False Dim DT_TBTC_DI_REGEX_MATCH As DataTable Try @@ -873,8 +893,6 @@ Public Class frmDIHauptseite #Region "*** BackgroundWorker wurde beendet ***" Private Sub threadDateiimport_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) 'Handles threadDateiimport.RunWorkerCompleted - ' This event fires when the DoWork event completes - Try Dim result As String = "" @@ -884,19 +902,32 @@ Public Class frmDIHauptseite MsgBox("Beim Dateiimport ist ein Fehler aufgetreten. Der Vorgang wurde abgebrochen." & vbNewLine & vbNewLine & "Dateiimport: Fehlernachricht:" & vbNewLine & e.Error.Message, MsgBoxStyle.Exclamation, "Vorgang auf Grund eines Fehlers abgebrochen") Else Me.progressImport.Value = 100 - 'MsgBox("Der Dateiimport für das Profil '" & Me.cmbProfilauswahl.SelectedItem & "' wurde erfolgreich durchgeführt.", MsgBoxStyle.Information, "Dateiimport: Vorgang erfolgreich beendet") - End If - ''MsgBox(filenameQuelle.Substring(0, filenameQuelle.LastIndexOf("\"))) - 'If Me.selectedProfile.VerzeichnisLöschen Then - ' Try - ' If Me.txtQuellordner.Text <> "" Then - ' My.Computer.FileSystem.DeleteDirectory(Me.txtQuellordner.Text, FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty) - ' End If - ' Catch ex As Exception - ' MsgBox("Der Vorgang wurde abgeschlossen. Das Quellverzeichnis konnte jedoch nicht gelöscht werden, da sich in dem Ordner noch Dateien/Verzeichnisse befinden.", MsgBoxStyle.Information, "Vorgang beendet:") - ' End Try - 'End If + ' Fehlermeldung für fehlerhafte Profile anzeigen + If FehlerProfileListe.Count > 0 Then + Dim fehlerMessage As New System.Text.StringBuilder() + fehlerMessage.AppendLine("ACHTUNG: Fehler in folgenden Profilen:") + fehlerMessage.AppendLine() + + For Each profilname As String In FehlerProfileListe + fehlerMessage.AppendLine(" • " & profilname) + Next + + fehlerMessage.AppendLine() + fehlerMessage.AppendLine("Bitte kontrollieren Sie die hinterlegten Quell- und Zielpfade,") + fehlerMessage.AppendLine("sowie die Zugriffsberechtigungen!") + + MsgBox(fehlerMessage.ToString(), MsgBoxStyle.Exclamation, "Fehlerhafte Profile erkannt") + + ' Fehler auch im Log vermerken + ClassLoggerDI.Add("======================================================================", False) + ClassLoggerDI.Add(" FEHLERHAFTE PROFILE: " & FehlerProfileListe.Count, True) + For Each profilname As String In FehlerProfileListe + ClassLoggerDI.Add(" - " & profilname, True) + Next + ClassLoggerDI.Add("======================================================================", False) + End If + End If ' den ersten Knoten öffnen und direkt wieder schließen, damit der letzte Knoten korrekt angezeigt wird ' -> sonst wird das letzte Element nicht richtig (nur zur Hälfte) angezeigt