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