Imports System.IO Imports System.Text.RegularExpressions Module LogBestandTextMapper Const MaximumAantalLogs As Integer = 5 Dim _busy As Boolean Private _huidigeLogPad = String.Empty Public ReadOnly Property HuidigeLogPad() As String Get Return _huidigeLogPad End Get End Property ''' ''' Wegschrijven van entry in het logbestand. ''' ''' De naam van de databank ''' Het bericht ''' Ofdat het stuk code is voltooid Public Sub WriteToFile(databank As String, logMessage As String, Optional voltooid As Boolean = False) 'Kijken of de log wel moet worden weggeschreven. if Not Configs.GeefLogOpslaanStatus() Then 'Logs moeten niet worden opgeslagen. Return End If 'Controleren of er nog geen log bestand was gemaakt. If Not _busy Then 'Geen log bestand was reeds aanwezig, aanmaken. StartNewLog() 'Bijhouden dat nieuw log bestand is aangemaakt. _busy = True End If Try 'Stream writer initialiseren met pad naar het log bestand. Tekst wordt niet overschreven, maar toegevoegd. Dim streamWriter = My.Computer.FileSystem.OpenTextFileWriter(_huidigeLogPad, True) 'De tekst die wordt weggeschreven opbouwen: datum databank naam status bericht. Dim logText = String.Format("{0,-23}{1,-10}{3,-13}{2}", Now.ToString("yyyy-MM-dd HH:mm:ss"), databank, logMessage, If(voltooid, "VOLTOOID!", "")) 'Wegschrijven. streamWriter.WriteLine(logText) 'De stream writer sluiten. streamWriter.Close() Catch ex As Exception Throw New Exception($"Log bestand kon niet worden gevuld.{vbNewLine}{ex.Message}") End Try End Sub Private Sub StartNewLog() Try 'Hoofding opbouwen. Dim hoofding = String.Format("{0,-23}{1,-10}{3,-13}{2}", "Datum", "Databank", "Bericht", "Status") 'Nieuw log bestand aanmaken en pad er naartoe opslaan. _huidigeLogPad = MaakNieuweLogFile() 'Streamwriter initialiseren. Dim streamWriter = My.Computer.FileSystem.OpenTextFileWriter(_huidigeLogPad, False) 'Hoofding wegschrijven. streamWriter.WriteLine(hoofding) 'Stream sluiten. streamWriter.Close() Catch ex As Exception Throw New Exception($"Log bestand kon niet worden aangemaakt.{vbNewLine}{ex.Message}") End Try End Sub 'Vorige pad maar eenmalig bepalen en dan bijhouden. Private _vorigeLogPad = String.Empty ''' ''' Naam van de vorige log. ''' Als het nieuwe log bestand nog niet is aangemaakt is dit het meest recente. Indien dit wel het geval is, wordt het tweede meest recente log bestand gekozen. ''' ''' Pad Public Function GeefPadVorigeLog() As String 'Als het vorige log pad al is bepaald retourneren we dit. if Not String.IsNullOrEmpty(_vorigeLogPad) Then Return _vorigeLogPad End If Try 'Nummers en paden opvragen. Dim nummersEnPadenDict = GeefLogNummersEnPaden() 'Controleren of er wel logs beschikbaar zijn, anders lege string retourneren. If nummersEnPadenDict.Count = 0 Then 'Nog geen logs aanwezig. Return String.Empty ElseIf nummersEnPadenDict.Count = 1 And (Not String.IsNullOrEmpty(_huidigeLogPad)) Then 'Er is een log aanwezig, maar dit is de huidige log. Return String.Empty End If 'Nummers uit dictionary halen. Dim nummers = nummersEnPadenDict.Keys.ToList() 'Log nummers sorteren oud -> nieuw. nummers.Sort() 'Nummer van de juiste log. Dim nummerLog As Integer 'Kijken of het nieuwe log bestand al is aangemaakt. If Not String.IsNullOrEmpty(_huidigeLogPad) Then 'Zo ja, retourneer het voorlaatste pad. nummerLog = nummers.Item(nummers.Count - 2) Else 'Zo neen, retourneer laatste pad. nummerLog = nummers.Item(nummers.Count -1) End If 'Pad opvragen uit dictionary en toewijzen aan variabele. _vorigeLogPad = nummersEnPadenDict.Item(nummerLog) 'Retourneren. Return _vorigeLogPad Catch ex As Exception Throw New Exception($"Kon pad naar vorige log niet opvragen.{vbNewLine}{ex.Message}") End Try End Function Private Function MaakNieuweLogFile() As String Try 'Opvragen map met logs. Dim logFolderPath As String = GetPathLogFolder() 'Nummers en paden opvragen. Dim nummersEnPadenDict = GeefLogNummersEnPaden() 'Controleren of er nog geen logs aanwezig zijn, anders pad naar initiële log retourneren. If nummersEnPadenDict.Count = 0 Then Return Path.Combine(logFolderPath, "1.txt") End If 'Nummers uit dictionary halen. Dim nummers = nummersEnPadenDict.Keys.ToList() 'Log nummers sorteren oud -> nieuw. nummers.Sort() 'Controleren of het aantal logs het maximum heeft overschreden. If nummers.Count >= MaximumAantalLogs Then 'Aan de hand van het nummer van de oudste log, het pad opvragen. Dim pad = nummersEnPadenDict.Item(nummers.Item(0)) 'De log verwijderen aan de hand van het pad. My.Computer.FileSystem.DeleteFile(pad) End If 'Nummer van de laatste log opvragen, verhogen en bijhouden. Dim nieuweLogNummer = nummers.Item(nummers.Count -1) + 1 'Nieuw log pad opbouwen en retourneren. Return Path.Combine(logFolderPath, $"{nieuweLogNummer}.txt") Catch ex As Exception Throw New Exception($"Er is iets fout gelopen bij het maken van het nieuwe log bestand.{vbNewLine}{ex.Message}") End Try End Function Private Function GeefLogNummersEnPaden() As Dictionary(Of Integer, String) 'Dictionary initialiseren met als sleutel de nummer en value het pad van de log. Dim nummersEnPadenDict = New Dictionary(Of Integer, String) 'Log map opvragen. Dim pathLogFolder = GetPathLogFolder() 'Alle bestanden hierin overlopen en opslaan in lijst. Dim logBestandspaden = Directory.EnumerateFiles(pathLogFolder).ToList() 'Controleren of er wel logs beschikbaar zijn, anders lege dictionary retourneren. If logBestandspaden.Count = 0 Then 'Nog geen logs aanwezig. Return nummersEnPadenDict End If 'Log nummer uit het pad halen. 'Dictionary vullen. For Each pad In logBestandspaden 'Laatste nummer nemen, dat nadien niet wordt gevolgd door een nummer. Dim nummer = Regex.Match(pad, "(\d+)(?!.*\d)").Value 'Toevoegen aan dictionary. nummersEnPadenDict.Add(nummer, pad) Next 'Opgevulde dictionary retourneren. Return nummersEnPadenDict End Function Public Function GetPathLogFolder() As String Try 'Opvragen van het pad naar het bureaublad. Dim desktopPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) 'Pad naar log folder opbouwen. Dim logFolderPath = Path.Combine(desktopPath, "TAOR REWORK LOGS") 'Als de folder nog niet bestaat, aanmaken. If (Not Directory.Exists(logFolderPath)) Then Directory.CreateDirectory(logFolderPath) End If Return logFolderPath Catch ex As Exception Throw New Exception($"Kon pad van de map met logs niet opvragen of kon map niet aanmaken.{vbNewLine}{ex.Message}") End Try End Function End Module