I wrote a small VBScript class that processes "real" ini files written with this format:
[section_name]
key1 = value1
key2 = value2
Code for class:
Class IniFileObject Private m_Data Private Sub Class_Initialize Set m_Data = Server.CreateObject("Scripting.Dictionary") End Sub Private Sub Class_Terminate Dim key If IsObject(m_Data) Then For Each key In m_Data m_Data(key).RemoveAll Set m_Data(key) = Nothing Next m_Data.RemoveAll Set m_Data = Nothing End If End Sub Public Function Init(sFilePath) Dim arrLines, sLine, x Dim sCurSection, oSectionDict Set Init = Me arrLines = GetFileLines(sFilePath) If Not(IsArray(arrLines)) Then Exit Function sCurSection = "" For x = 0 To UBound(arrLines) sLine = Trim(arrLines(x)) If Len(sLine)>0 Then If Left(sLine, 1)="[" Then If Not(HandleSectionLine(sLine, sCurSection)) Then Exit Function Else If Len(sCurSection)=0 Then Err.Raise 1005, "IniFileObject init", "Found value outside any section (" & Server.HTMLEncode(sLine) & ")" Exit Function End If Set oSectionDict = m_Data(sCurSection) If Not(ParseOneLine(sLine, oSectionDict)) Then Exit Function Set m_Data(sCurSection) = oSectionDict End If End If Next End Function Public Property Get ReadValue(section, key) Dim oSectionDict ReadValue = "" If m_Data.Exists(section) Then Set oSectionDict = m_Data(section) If oSectionDict.Exists(key) Then ReadValue = oSectionDict(key) End If End Property Private Function ParseOneLine(ByVal sLine, ByRef oSectionDict) Dim arrTemp, sErrorMsg, sKey sErrorMsg = "" ParseOneLine = True If Left(sLine, 2)="//" Or Left(sLine, 1)="'" Or Left(sLine, 1)="{" Then Exit Function arrTemp = Split(sLine, "=") If UBound(arrTemp)=1 Then sKey = Trim(arrTemp(0)) If (Len(sKey)>0) And (Len(arrTemp(1))>0) Then If Not(oSectionDict.Exists(sKey)) Then oSectionDict.Add sKey, Trim(arrTemp(1)) Else sErrorMsg = "Key already exists" End If Else sErrorMsg = "Empty key or value" End If Else sErrorMsg = "Missing or too much '=' characters" End If Erase arrTemp If Len(sErrorMsg)>0 Then ParseOneLine = False Err.Raise 1006, "IniFileObject Init", "Failed to parse single line (" & Server.HTMLEncode(sLine) & "): " & sErrorMsg End If End Function Private Function HandleSectionLine(ByVal sLine, ByRef sCurSection) HandleSectionLine = False If (Len(sLine)<3) Or (Right(sLine, 1)<>"]") Then Err.Raise 1002, "IniFileObject init", "Invalid line found: " & Server.HTMLEncode(sLine) Exit Function End If sCurSection = Mid(sLine, 2, Len(sLine) - 2) If m_Data.Exists(sCurSection) Then Err.Raise 1003, "IniFileObject init", "Section exists more than once: " & Server.HTMLEncode(sCurSection) Exit Function End If m_Data.Add sCurSection, Server.CreateObject("Scripting.Dictionary") HandleSectionLine = True End Function Private Function GetFileLines(sFilePath) Dim objFSO, oFile Set objFSO = Server.CreateObject("Scripting.FileSystemObject") If Not(objFSO.FileExists(sFilePath)) Then Set objFSO = Nothing Err.Raise 1001, "IniFileObject init", "file path '" & Server.HTMLEncode(sFilePath) & "' does not exist, check permissions" Exit Function End If Set oFile = objFSO.OpenTextFile(sFilePath) GetFileLines = Split(oFile.ReadAll, VBCrLf) oFile.Close Set oFile = Nothing Set objFSO = Nothing End Function End Class
Usage example:
Dim filePath, ini filePath = Server.MapPath("config.ini") Set ini = New IniFileObject.Init(filePath) Response.Write("Value for 'Key001': " & ini.ReadValue("MySection", "Key001") & "<br />") Set ini = Nothing
The code generates various errors, when the file does not exist or contains invalid lines, the errors are largely clear. It can βsuppressβ errors and not display an error page when using this code when consumed:
On Error Resume Next Set ini = New IniFileObject.Init(filePath) If Err.Number<>0 Then Response.Write("Error reading ini file") End If On Error Goto 0 If IsObject(ini) Then Response.Write("Value for 'IP001': " & ini.ReadValue("IPaddress", "IP001") & "<br />") Set ini = Nothing End If