Moin moin
Ich verzweifel an einer "System.IO.FileNotFoundException", weil ich einfach nicht herausfinde:
1.) Warum diese kommt
2.) Wer die wirft
Das ist in .Net6 und .Net8 identisch!
Hier mein Code der dll und eine entsprechende Debug Ausgabe:
Spoiler anzeigen
Ich verzweifel an einer "System.IO.FileNotFoundException", weil ich einfach nicht herausfinde:
1.) Warum diese kommt
2.) Wer die wirft
Das ist in .Net6 und .Net8 identisch!
Hier mein Code der dll und eine entsprechende Debug Ausgabe:
Der relevante Code in der DLL:
Die Debugausgaben in dem kleinen Testprogramm
Der relevante Code in der DLL:
VB.NET-Quellcode
-
- Public Class CalculatedAverages
- ' Singleton-Instanz, Thread-sicher durch statische Initialisierung
- Public Shared ReadOnly Instance As New CalculatedAverages()
- ' Um die monatlichen Durchschnittswerte zu speichern
- Private ReadOnly _monthlyAverages As New List(Of ClimaAverage)()
- ' Dienste laden
- Private ReadOnly _configHandler As ConfigHandler = ConfigHandler.Instance
- Private ReadOnly _propertySetter As PropertySetter = PropertySetter.Instance
- ' Getter für die monatlichen Durchschnittswerte
- Public Function GetMonthlyAverages() As List(Of ClimaAverage)
- Return _monthlyAverages
- End Function
- ' Summen für die Berechnungen
- Dim monthlyRainDay As Double = 0
- Dim monthlySnowDay As Double = 0
- Dim monthlySnowNight As Double = 0
- Dim monthlyHumidiMinDay As Double = 0
- Dim monthlyHumidiMaxDay As Double = 0
- Dim monthlyHumidiMinNight As Double = 0
- Dim monthlyHumidiMaxNight As Double = 0
- Dim monthlyTempDay As Double = 0
- Dim monthlyTempNight As Double = 0
- Dim monthlyWindDay As Double = 0
- Dim monthlyWindNight As Double = 0
- Dim count As Integer = 0
- Public Function GetXmlFiles(selectedYear As Integer, month As Integer) As List(Of String)
- Try
- ' Erstelle das Suchmuster für die Datei
- Dim monthPattern As String = $"{month:00}-{selectedYear}.xml"
- Dim directoryPath As String = _configHandler.DataDirectory
- Debug.WriteLine($"Suche nach Dateien mit Muster: {monthPattern} im Verzeichnis: {directoryPath}")
- ' Überprüfe, ob das Verzeichnis existiert
- If Not Directory.Exists(directoryPath) Then
- Throw New DirectoryNotFoundException($"Das Verzeichnis '{directoryPath}' wurde nicht gefunden.")
- End If
- ' Suche die Dateien im angegebenen Verzeichnis
- Dim files = Directory.GetFiles(directoryPath, monthPattern, SearchOption.TopDirectoryOnly).ToList()
- ' Zeige die gefundenen Dateien an
- If files.Any() Then
- Debug.WriteLine($"Gefundene Dateien: {String.Join(", ", files)}")
- Else
- Debug.WriteLine($"Keine Dateien für {monthPattern} im Verzeichnis {directoryPath} gefunden.")
- End If
- Return files
- Catch ex As FileNotFoundException
- Debug.WriteLine($"Datei nicht gefunden: {ex.Message}")
- Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
- Catch ex As DirectoryNotFoundException
- ' Fehlerbehandlung bei Verzeichnissuche
- Debug.WriteLine($"Fehler: {ex.Message}")
- Return Nothing
- Catch ex As Exception
- ' Allgemeine Fehlerbehandlung
- Debug.WriteLine($"Fehler in GetXmlFiles: {ex.Message}")
- Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
- Return Nothing
- End Try
- Return Nothing
- End Function
- Public Sub CallCalculation()
- Try
- ' Ausgabe zu Beginn der Berechnungen
- Debug.WriteLine("Berechnung startet...")
- _monthlyAverages.Clear()
- ' Durchlaufe alle Monate (1 bis 12)
- For month As Integer = 1 To 12
- Debug.WriteLine($"Verarbeite Monat {month} für Jahr {_propertySetter.CurrentYear}")
- ' Aufruf der Methode, die die XML-Dateien für den Monat zurückgibt
- Dim files As List(Of String) = GetXmlFiles(_propertySetter.CurrentYear, month)
- ' Wenn Dateien gefunden wurden, fortfahren mit der Verarbeitung
- If files IsNot Nothing AndAlso files.Count > 0 Then
- VerarbeiteMonat(files, month)
- Else
- Debug.WriteLine($"Keine Wetterdaten für {month:00}-{_propertySetter.CurrentYear} gefunden.")
- End If
- Next
- ' Abschluss der Berechnung
- Debug.WriteLine("Berechnungen abgeschlossen.")
- Catch ex As FileNotFoundException
- Debug.WriteLine($"Fehler: Datei nicht gefunden. {ex.Message}")
- Catch ex As UnauthorizedAccessException
- Debug.WriteLine($"Zugriffsfehler auf Datei: {ex.Message}")
- Catch ex As IOException
- Debug.WriteLine($"E/A Fehler beim Öffnen der Datei: {ex.Message}")
- Catch ex As Exception
- Debug.WriteLine($"Unbekannter Fehler beim Verarbeiten der Datei: {ex.Message}")
- Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
- End Try
- End Sub
- Private Sub VerarbeiteMonat(files As List(Of String), month As Integer)
- ' Initialisiere Zähler und Summen für den Monat
- ResetMonthlySummaries()
- ' Durchlaufe alle gefundenen Dateien
- For Each filename As String In files
- Debug.WriteLine($"Verarbeite Datei: {filename}")
- Try
- ' Überprüfe, ob die Datei existiert, bevor sie geöffnet wird
- If Not File.Exists(filename) Then
- Debug.WriteLine($"Die Datei '{filename}' existiert nicht. Aussteigen.")
- Exit Sub
- End If
- ' Datei öffnen und einlesen
- OpenXmlFile(filename)
- Catch ex As UnauthorizedAccessException
- Debug.WriteLine($"Zugriff verweigert auf Datei {filename}: {ex.Message}")
- Catch ex As Exception
- Debug.WriteLine($"Unerwarteter Fehler beim Verarbeiten der Datei {filename}: {ex.Message}")
- End Try
- Next
- ' Wenn Daten vorhanden sind, berechne die Durchschnittswerte
- If count > 0 Then
- BerechneUndSpeichereDurchschnittswerte(month)
- Else
- Debug.WriteLine($"Monat {month}: Keine Daten gefunden, Durchschnittswerte werden nicht berechnet.")
- End If
- End Sub
- Private Sub ResetMonthlySummaries()
- ' Setze alle Summen auf 0 zurück
- monthlyRainDay = 0
- monthlySnowDay = 0
- monthlySnowNight = 0
- monthlyHumidiMinDay = 0
- monthlyHumidiMaxDay = 0
- monthlyHumidiMinNight = 0
- monthlyHumidiMaxNight = 0
- monthlyTempDay = 0
- monthlyTempNight = 0
- monthlyWindDay = 0
- monthlyWindNight = 0
- count = 0
- End Sub
- Private Sub BerechneUndSpeichereDurchschnittswerte(month As Integer)
- Debug.WriteLine($"Berechne Durchschnittswerte für Monat {month}, Zähler: {count}")
- ' Berechne die Durchschnittswerte
- Dim avgRain = Math.Round(monthlyRainDay / count, 2)
- Dim avgSnowDay = Math.Round(monthlySnowDay / count, 2)
- Dim avgSnowNight = Math.Round(monthlySnowNight / count, 2)
- Dim avgHumidiMinDay = Math.Round(monthlyHumidiMinDay / count, 2)
- Dim avgHumidiMaxDay = Math.Round(monthlyHumidiMaxDay / count, 2)
- Dim avgHumidiMinNight = Math.Round(monthlyHumidiMinNight / count, 2)
- Dim avgHumidiMaxNight = Math.Round(monthlyHumidiMaxNight / count, 2)
- Dim avgTempDay = Math.Round(monthlyTempDay / count, 2)
- Dim avgTempNight = Math.Round(monthlyTempNight / count, 2)
- Dim avgWindDay = Math.Round(monthlyWindDay / count, 2)
- Dim avgWindNight = Math.Round(monthlyWindNight / count, 2)
- ' Füge die berechneten Durchschnittswerte zur Liste hinzu
- _monthlyAverages.Add(New ClimaAverage() With {
- .Period = month,
- .AverageRain = avgRain,
- .AverageSnowDay = avgSnowDay,
- .AverageSnowNight = avgSnowNight,
- .AverageHumidiMinDay = avgHumidiMinDay,
- .AverageHumidiMaxDay = avgHumidiMaxDay,
- .AverageHumidiMinNight = avgHumidiMinNight,
- .AverageHumidiMaxNight = avgHumidiMaxNight,
- .AverageTempDay = avgTempDay,
- .AverageTempNight = avgTempNight,
- .AverageWindDay = avgWindDay,
- .AverageWindNight = avgWindNight
- })
- Debug.WriteLine($"Durchschnittswerte für Monat {month}: Regen {avgRain}")
- End Sub
- Private Sub OpenXmlFile(newfileName As String)
- Try
- ' Versuche die Datei zu öffnen, mit FileShare.ReadWrite, um parallelen Zugriff zu erlauben
- Using fs As New FileStream(newfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
- Debug.WriteLine($"Öffne Datei: {newfileName}")
- ' Deserialisiere die Wetterdaten aus der XML-Datei
- Dim serializer As New XmlSerializer(GetType(WeatherDataArray))
- Dim data As WeatherDataArray
- ' Überprüfe, ob die Datei korrekt deserialisiert werden kann
- Try
- data = CType(serializer.Deserialize(fs), WeatherDataArray)
- Catch ex As InvalidOperationException
- ' Fehler beim Deserialisieren der Datei
- Debug.WriteLine($"Fehler beim Deserialisieren der Datei {newfileName}: {ex.Message}")
- Return
- End Try
- ' Überprüfe, ob Daten in der Datei enthalten sind
- If data.Count > 0 Then
- count += data.Count
- Debug.WriteLine($"Deserialisierte {data.Count} Einträge aus der Datei {newfileName}.")
- ' Summiere die Werte für alle relevanten Parameter
- Dim rainSum As Double = CDbl(data.Sum(Function(wd) wd.RainDay))
- Dim snowDaySum As Double = CDbl(data.Sum(Function(wd) wd.SnowDay))
- Dim snowNightSum As Double = CDbl(data.Sum(Function(wd) wd.SnowNight))
- Dim humidiMinDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinDay))
- Dim humidiMaxDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxDay))
- Dim humidiMinNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinNight))
- Dim humidiMaxNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxNight))
- Dim tempDaySum As Double = CDbl(data.Sum(Function(wd) wd.TempDay))
- Dim tempNightSum As Double = CDbl(data.Sum(Function(wd) wd.TempNight))
- Dim windDaySum As Double = CDbl(data.Sum(Function(wd) wd.WindDay))
- Dim windNightSum As Double = CDbl(data.Sum(Function(wd) wd.WindNight))
- ' Summiere die Werte auf Monatsebene
- monthlyRainDay += rainSum
- monthlySnowDay += snowDaySum
- monthlySnowNight += snowNightSum
- monthlyHumidiMinDay += humidiMinDaySum
- monthlyHumidiMaxDay += humidiMaxDaySum
- monthlyHumidiMinNight += humidiMinNightSum
- monthlyHumidiMaxNight += humidiMaxNightSum
- monthlyTempDay += tempDaySum
- monthlyTempNight += tempNightSum
- monthlyWindDay += windDaySum
- monthlyWindNight += windNightSum
- Else
- Debug.WriteLine($"Keine Wetterdaten in Datei {newfileName} gefunden.")
- End If
- End Using
- Catch ex As FileNotFoundException
- Debug.WriteLine($"Fehler: Datei '{newfileName}' nicht gefunden. {ex.Message}")
- Catch ex As UnauthorizedAccessException
- Debug.WriteLine($"Zugriffsfehler auf Datei '{newfileName}': {ex.Message}")
- Catch ex As IOException
- Debug.WriteLine($"E/A Fehler beim Öffnen der Datei '{newfileName}': {ex.Message}")
- Catch ex As Exception
- Debug.WriteLine($"Unbekannter Fehler beim Verarbeiten der Datei '{newfileName}': {ex.Message}")
- Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
- End Try
- End Sub
- End Class
Die Debugausgaben in dem kleinen Testprogramm
XML-Quellcode
-
- Berechnung startet...
- Verarbeite Monat 1 für Jahr 2023
- Suche nach Dateien mit Muster: 01-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
- Gefundene Dateien: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml
- Verarbeite Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml
- Öffne Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml
- Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
- Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
- Deserialisierte 31 Einträge aus der Datei C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml.
- Berechne Durchschnittswerte für Monat 1, Zähler: 31
- Durchschnittswerte für Monat 1: Regen 3,19
- Verarbeite Monat 2 für Jahr 2023
- Suche nach Dateien mit Muster: 02-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
- Gefundene Dateien: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml
- Verarbeite Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml
- Öffne Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml
- Deserialisierte 28 Einträge aus der Datei C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml.
- Berechne Durchschnittswerte für Monat 2, Zähler: 28
- Durchschnittswerte für Monat 2: Regen 1,99
- Verarbeite Monat 3 für Jahr 2023
- Suche nach Dateien mit Muster: 03-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
- Keine Dateien für 03-2023.xml im Verzeichnis C:\Users\Nyxalor\AppData\Local\Zephyros\Data gefunden.
- Keine Wetterdaten für 03-2023 gefunden.
- ......
- ===> Bewust nur 2 XML-Files im Verzeichnis !!
- ................
- Verarbeite Monat 12 für Jahr 2023
- Suche nach Dateien mit Muster: 12-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
- Keine Dateien für 12-2023.xml im Verzeichnis C:\Users\Nyxalor\AppData\Local\Zephyros\Data gefunden.
- Keine Wetterdaten für 12-2023 gefunden.
- Berechnungen abgeschlossen.
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.