Imports System.IO
Imports System.Text.RegularExpressions
Module LogBestandTextMapper
Const AantalLogs As Integer = 5
Dim _busy As Boolean
Private _vorigeLogPad = String.Empty
Public ReadOnly Property VorigeLogPad() As String
Get
Return _vorigeLogPad
End Get
End Property
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)
'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
'''
''' 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.
'''
'''
Public Function GeefPadVorigeLog() As String
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 String.IsNullOrEmpty(_huidigeLogPad) Then
'Zo ja, retourneer het voorlaatste pad.
nummerLog = nummers.Item(nummers.Count - 1)
Else
'Zo neen, retourneer laatste pad.
nummerLog = nummers.Item(nummers.Count)
End If
'Pad opvragen uit dictionary en retourneren.
Return nummersEnPadenDict.Item(nummerLog)
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
Dim logFolderPath As String = GetPathLogFolder()
Dim vorigeLogFileAanwezig As Boolean
Dim volledigPadVorigeLogFile As String
For teller As Integer = 1 To AantalLogs
volledigPadVorigeLogFile = Path.Combine(logFolderPath, "log" & teller & teller & ".txt")
If System.IO.File.Exists(volledigPadVorigeLogFile) Then
vorigeLogFileAanwezig = True
'als er al een log bestaat, hernoemen en een nieuwe aanmaken
My.Computer.FileSystem.RenameFile(volledigPadVorigeLogFile, "log" & teller & ".txt")
Dim logIndex As Integer = ((teller Mod 5) + 1)
Dim padNieuweLogFile As String = Path.Combine(logFolderPath, "log" & logIndex & ".txt")
'kijken of de volgende log al bestaat, indien wel, verwijderen en nieuwe aanmaken
If System.IO.File.Exists(padNieuweLogFile) Then
My.Computer.FileSystem.DeleteFile(padNieuweLogFile)
End If
Return Path.Combine(logFolderPath, "log" & logIndex & logIndex & ".txt")
End If
Next
If Not vorigeLogFileAanwezig Then
Return Path.Combine(logFolderPath, "log" & 1 & 1 & ".txt")
End If
Throw New Exception("Er is iets fout gelopen bij het opvragen van het Path voor de log bestanden")
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