mirror of
https://github.com/romanlryji/EventLogLoader.git
synced 2024-11-28 08:48:40 +02:00
387 lines
14 KiB
VB.net
387 lines
14 KiB
VB.net
Imports System.IO
|
|
Imports System.Text.RegularExpressions
|
|
|
|
|
|
Public Class IniFileClass
|
|
' List of IniSection objects keeps track of all the sections in the INI file
|
|
Private m_sections As Hashtable
|
|
|
|
' Public constructor
|
|
Public Sub New()
|
|
m_sections = New Hashtable(StringComparer.InvariantCultureIgnoreCase)
|
|
End Sub
|
|
|
|
' Loads the Reads the data in the ini file into the IniFile object
|
|
Public Sub Load(ByVal sFileName As String, Optional ByVal bMerge As Boolean = False)
|
|
If Not bMerge Then
|
|
RemoveAllSections()
|
|
End If
|
|
' Clear the object...
|
|
Dim tempsection As IniSection = Nothing
|
|
Dim oReader As New StreamReader(sFileName)
|
|
Dim regexcomment As New Regex("^([\s]*#.*)", (RegexOptions.Singleline Or RegexOptions.IgnoreCase))
|
|
' Broken but left for history
|
|
'Dim regexsection As New Regex("\[[\s]*([^\[\s].*[^\s\]])[\s]*\]", (RegexOptions.Singleline Or RegexOptions.IgnoreCase))
|
|
Dim regexsection As New Regex("^[\s]*\[[\s]*([^\[\s].*[^\s\]])[\s]*\][\s]*$", (RegexOptions.Singleline Or RegexOptions.IgnoreCase))
|
|
Dim regexkey As New Regex("^\s*([^=\s]*)[^=]*=(.*)", (RegexOptions.Singleline Or RegexOptions.IgnoreCase))
|
|
While Not oReader.EndOfStream
|
|
Dim line As String = oReader.ReadLine()
|
|
If line <> String.Empty Then
|
|
Dim m As Match = Nothing
|
|
If regexcomment.Match(line).Success Then
|
|
m = regexcomment.Match(line)
|
|
Trace.WriteLine(String.Format("Skipping Comment: {0}", m.Groups(0).Value))
|
|
ElseIf regexsection.Match(line).Success Then
|
|
m = regexsection.Match(line)
|
|
Trace.WriteLine(String.Format("Adding section [{0}]", m.Groups(1).Value))
|
|
tempsection = AddSection(m.Groups(1).Value)
|
|
ElseIf regexkey.Match(line).Success AndAlso tempsection IsNot Nothing Then
|
|
m = regexkey.Match(line)
|
|
Trace.WriteLine(String.Format("Adding Key [{0}]=[{1}]", m.Groups(1).Value, m.Groups(2).Value))
|
|
tempsection.AddKey(m.Groups(1).Value).Value = m.Groups(2).Value
|
|
ElseIf tempsection IsNot Nothing Then
|
|
' Handle Key without value
|
|
Trace.WriteLine(String.Format("Adding Key [{0}]", line))
|
|
tempsection.AddKey(line)
|
|
Else
|
|
' This should not occur unless the tempsection is not created yet...
|
|
Trace.WriteLine(String.Format("Skipping unknown type of data: {0}", line))
|
|
End If
|
|
End If
|
|
End While
|
|
oReader.Close()
|
|
End Sub
|
|
|
|
' Used to save the data back to the file or your choice
|
|
Public Sub Save(ByVal sFileName As String)
|
|
Dim oWriter As New StreamWriter(sFileName, False)
|
|
For Each s As IniSection In Sections
|
|
Trace.WriteLine(String.Format("Writing Section: [{0}]", s.Name))
|
|
oWriter.WriteLine(String.Format("[{0}]", s.Name))
|
|
For Each k As IniSection.IniKey In s.Keys
|
|
If k.Value <> String.Empty Then
|
|
Trace.WriteLine(String.Format("Writing Key: {0}={1}", k.Name, k.Value))
|
|
oWriter.WriteLine(String.Format("{0}={1}", k.Name, k.Value))
|
|
Else
|
|
Trace.WriteLine(String.Format("Writing Key: {0}", k.Name))
|
|
oWriter.WriteLine(String.Format("{0}", k.Name))
|
|
End If
|
|
Next
|
|
Next
|
|
oWriter.Close()
|
|
End Sub
|
|
|
|
' Gets all the sections
|
|
Public ReadOnly Property Sections() As System.Collections.ICollection
|
|
Get
|
|
Return m_sections.Values
|
|
End Get
|
|
End Property
|
|
|
|
' Adds a section to the IniFile object, returns a IniSection object to the new or existing object
|
|
Public Function AddSection(ByVal sSection As String) As IniSection
|
|
Dim s As IniSection = Nothing
|
|
sSection = sSection.Trim()
|
|
' Trim spaces
|
|
If m_sections.ContainsKey(sSection) Then
|
|
s = DirectCast(m_sections(sSection), IniSection)
|
|
Else
|
|
s = New IniSection(Me, sSection)
|
|
m_sections(sSection) = s
|
|
End If
|
|
Return s
|
|
End Function
|
|
|
|
' Removes a section by its name sSection, returns trus on success
|
|
Public Function RemoveSection(ByVal sSection As String) As Boolean
|
|
sSection = sSection.Trim()
|
|
Return RemoveSection(GetSection(sSection))
|
|
End Function
|
|
|
|
' Removes section by object, returns trus on success
|
|
Public Function RemoveSection(ByVal Section As IniSection) As Boolean
|
|
If Section IsNot Nothing Then
|
|
Try
|
|
m_sections.Remove(Section.Name)
|
|
Return True
|
|
Catch ex As Exception
|
|
Trace.WriteLine(ex.Message)
|
|
End Try
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' Removes all existing sections, returns trus on success
|
|
Public Function RemoveAllSections() As Boolean
|
|
m_sections.Clear()
|
|
Return (m_sections.Count = 0)
|
|
End Function
|
|
|
|
' Returns an IniSection to the section by name, NULL if it was not found
|
|
Public Function GetSection(ByVal sSection As String) As IniSection
|
|
sSection = sSection.Trim()
|
|
' Trim spaces
|
|
If m_sections.ContainsKey(sSection) Then
|
|
Return DirectCast(m_sections(sSection), IniSection)
|
|
End If
|
|
Return Nothing
|
|
End Function
|
|
|
|
' Returns a KeyValue in a certain section
|
|
Public Function GetKeyValue(ByVal sSection As String, ByVal sKey As String) As String
|
|
Dim s As IniSection = GetSection(sSection)
|
|
If s IsNot Nothing Then
|
|
Dim k As IniSection.IniKey = s.GetKey(sKey)
|
|
If k IsNot Nothing Then
|
|
Return k.Value
|
|
End If
|
|
End If
|
|
Return String.Empty
|
|
End Function
|
|
|
|
' Sets a KeyValuePair in a certain section
|
|
Public Function SetKeyValue(ByVal sSection As String, ByVal sKey As String, ByVal sValue As String) As Boolean
|
|
Dim s As IniSection = AddSection(sSection)
|
|
If s IsNot Nothing Then
|
|
Dim k As IniSection.IniKey = s.AddKey(sKey)
|
|
If k IsNot Nothing Then
|
|
k.Value = sValue
|
|
Return True
|
|
End If
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' Renames an existing section returns true on success, false if the section didn't exist or there was another section with the same sNewSection
|
|
Public Function RenameSection(ByVal sSection As String, ByVal sNewSection As String) As Boolean
|
|
' Note string trims are done in lower calls.
|
|
Dim bRval As Boolean = False
|
|
Dim s As IniSection = GetSection(sSection)
|
|
If s IsNot Nothing Then
|
|
bRval = s.SetName(sNewSection)
|
|
End If
|
|
Return bRval
|
|
End Function
|
|
|
|
' Renames an existing key returns true on success, false if the key didn't exist or there was another section with the same sNewKey
|
|
Public Function RenameKey(ByVal sSection As String, ByVal sKey As String, ByVal sNewKey As String) As Boolean
|
|
' Note string trims are done in lower calls.
|
|
Dim s As IniSection = GetSection(sSection)
|
|
If s IsNot Nothing Then
|
|
Dim k As IniSection.IniKey = s.GetKey(sKey)
|
|
If k IsNot Nothing Then
|
|
Return k.SetName(sNewKey)
|
|
End If
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' Remove a key by section name and key name
|
|
Public Function RemoveKey(ByVal sSection As String, ByVal sKey As String) As Boolean
|
|
Dim s As IniSection = GetSection(sSection)
|
|
If s IsNot Nothing Then
|
|
Return s.RemoveKey(sKey)
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' IniSection class
|
|
Public Class IniSection
|
|
' IniFile IniFile object instance
|
|
Private m_pIniFile As IniFileClass
|
|
' Name of the section
|
|
Private m_sSection As String
|
|
' List of IniKeys in the section
|
|
Private m_keys As Hashtable
|
|
|
|
' Constuctor so objects are internally managed
|
|
Protected Friend Sub New(ByVal parent As IniFileClass, ByVal sSection As String)
|
|
m_pIniFile = parent
|
|
m_sSection = sSection
|
|
m_keys = New Hashtable(StringComparer.InvariantCultureIgnoreCase)
|
|
End Sub
|
|
|
|
' Returns all the keys in a section
|
|
Public ReadOnly Property Keys() As System.Collections.ICollection
|
|
Get
|
|
Return m_keys.Values
|
|
End Get
|
|
End Property
|
|
|
|
' Returns the section name
|
|
Public ReadOnly Property Name() As String
|
|
Get
|
|
Return m_sSection
|
|
End Get
|
|
End Property
|
|
|
|
' Adds a key to the IniSection object, returns a IniKey object to the new or existing object
|
|
Public Function AddKey(ByVal sKey As String) As IniKey
|
|
sKey = sKey.Trim()
|
|
Dim k As IniSection.IniKey = Nothing
|
|
If sKey.Length <> 0 Then
|
|
If m_keys.ContainsKey(sKey) Then
|
|
k = DirectCast(m_keys(sKey), IniKey)
|
|
Else
|
|
k = New IniSection.IniKey(Me, sKey)
|
|
m_keys(sKey) = k
|
|
End If
|
|
End If
|
|
Return k
|
|
End Function
|
|
|
|
' Removes a single key by string
|
|
Public Function RemoveKey(ByVal sKey As String) As Boolean
|
|
Return RemoveKey(GetKey(sKey))
|
|
End Function
|
|
|
|
' Removes a single key by IniKey object
|
|
Public Function RemoveKey(ByVal Key As IniKey) As Boolean
|
|
If Key IsNot Nothing Then
|
|
Try
|
|
m_keys.Remove(Key.Name)
|
|
Return True
|
|
Catch ex As Exception
|
|
Trace.WriteLine(ex.Message)
|
|
End Try
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' Removes all the keys in the section
|
|
Public Function RemoveAllKeys() As Boolean
|
|
m_keys.Clear()
|
|
Return (m_keys.Count = 0)
|
|
End Function
|
|
|
|
' Returns a IniKey object to the key by name, NULL if it was not found
|
|
Public Function GetKey(ByVal sKey As String) As IniKey
|
|
sKey = sKey.Trim()
|
|
If m_keys.ContainsKey(sKey) Then
|
|
Return DirectCast(m_keys(sKey), IniKey)
|
|
End If
|
|
Return Nothing
|
|
End Function
|
|
|
|
' Sets the section name, returns true on success, fails if the section
|
|
' name sSection already exists
|
|
Public Function SetName(ByVal sSection As String) As Boolean
|
|
sSection = sSection.Trim()
|
|
If sSection.Length <> 0 Then
|
|
' Get existing section if it even exists...
|
|
Dim s As IniSection = m_pIniFile.GetSection(sSection)
|
|
If s IsNot Me AndAlso s IsNot Nothing Then
|
|
Return False
|
|
End If
|
|
Try
|
|
' Remove the current section
|
|
m_pIniFile.m_sections.Remove(m_sSection)
|
|
' Set the new section name to this object
|
|
m_pIniFile.m_sections(sSection) = Me
|
|
' Set the new section name
|
|
m_sSection = sSection
|
|
Return True
|
|
Catch ex As Exception
|
|
Trace.WriteLine(ex.Message)
|
|
End Try
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' Returns the section name
|
|
Public Function GetName() As String
|
|
Return m_sSection
|
|
End Function
|
|
|
|
' IniKey class
|
|
Public Class IniKey
|
|
' Name of the Key
|
|
Private m_sKey As String
|
|
' Value associated
|
|
Private m_sValue As String
|
|
' Pointer to the parent CIniSection
|
|
Private m_section As IniSection
|
|
|
|
' Constuctor so objects are internally managed
|
|
Protected Friend Sub New(ByVal parent As IniSection, ByVal sKey As String)
|
|
m_section = parent
|
|
m_sKey = sKey
|
|
End Sub
|
|
|
|
' Returns the name of the Key
|
|
Public ReadOnly Property Name() As String
|
|
Get
|
|
Return m_sKey
|
|
End Get
|
|
End Property
|
|
|
|
' Sets or Gets the value of the key
|
|
Public Property Value() As String
|
|
Get
|
|
Return m_sValue
|
|
End Get
|
|
Set(ByVal value As String)
|
|
m_sValue = value
|
|
End Set
|
|
End Property
|
|
|
|
' Sets the value of the key
|
|
Public Sub SetValue(ByVal sValue As String)
|
|
m_sValue = sValue
|
|
End Sub
|
|
' Returns the value of the Key
|
|
Public Function GetValue() As String
|
|
Return m_sValue
|
|
End Function
|
|
|
|
' Sets the key name
|
|
' Returns true on success, fails if the section name sKey already exists
|
|
Public Function SetName(ByVal sKey As String) As Boolean
|
|
sKey = sKey.Trim()
|
|
If sKey.Length <> 0 Then
|
|
Dim k As IniKey = m_section.GetKey(sKey)
|
|
If k IsNot Me AndAlso k IsNot Nothing Then
|
|
Return False
|
|
End If
|
|
Try
|
|
' Remove the current key
|
|
m_section.m_keys.Remove(m_sKey)
|
|
' Set the new key name to this object
|
|
m_section.m_keys(sKey) = Me
|
|
' Set the new key name
|
|
m_sKey = sKey
|
|
Return True
|
|
Catch ex As Exception
|
|
Trace.WriteLine(ex.Message)
|
|
End Try
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
' Returns the name of the Key
|
|
Public Function GetName() As String
|
|
Return m_sKey
|
|
End Function
|
|
End Class
|
|
' End of IniKey class
|
|
|
|
End Class
|
|
|
|
Public Function RestoreIniValue(Param As IniFileClass, SectionText As String, KeyText As String) As String
|
|
Dim Section As IniFileClass.IniSection = Param.GetSection(SectionText)
|
|
If Not Section Is Nothing Then
|
|
Dim Key As IniFileClass.IniSection.IniKey = Section.GetKey(KeyText)
|
|
If Not Key Is Nothing Then
|
|
RestoreIniValue = Key.Value
|
|
Else
|
|
RestoreIniValue = ""
|
|
End If
|
|
Else
|
|
RestoreIniValue = ""
|
|
End If
|
|
End Function
|
|
' End of IniSection class
|
|
End Class
|
|
|
|
|