Code archives/File Utilities/INI file functions
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| The two main functions (INI_ReadValue and INI_WriteValue) require no external arrays/variables - I've kept them completely self contained. The WriteINIFile function will create the INI file if it does not exist, create new sections if required and delete key values etc. | |||||
; Title: INI Read and Write functions
; Version: 1.22
; Revised: November 11th 2002
; Author: Leigh Bowers
; Email: leigh.bowers@curvesoftware.co.uk
; Web: http://www.curvesoftware.co.uk/blitz
; History:
; 1.22 Failed to rename a variable during the v1.21 update - Fixed.
; 1.21 Functions/variables renamed for consitency, clarity & to avoid conflicts with globals - Prefxed with "INI_".
; 1.20 Bug fix: INI files with a single section could behave weirdly (thanks to Jacob Sindelir for highlighting the problem).
; 1.13 More efficient use of Upper$.
; 1.12 Minor optimisations/tweaks.
; 1.11 First public release (1.10 + enhancement).
; Read/Write: Added support for INI sections.
; Read: Now removes leader and trailer quotes where applicable (optional).
; 1.04 Initial internal release.
; Example usage:
;Print "INI Value = " + INI_ReadValue("Archon", "Video", "Resolution", "800x600")
;bSuccess% = INI_WriteValue("Archon", "Audio", "Music", "0")
Function INI_ReadValue$(INI_sAppName$, INI_sSection$, INI_sKey$, INI_sDefault$)
; Returns: INI Value (String) - The INI_sDefault value is returned if no SECTION/KEY combination is found
INI_sSection = "[" + Upper$(Trim$(INI_sSection)) + "]"
INI_sKey = Upper$(Trim$(INI_sKey))
INI_sFilename$ = CurrentDir$() + "\" + INI_sAppName + ".ini"
; Retrieve the INI data
INI_sContents$= INI_FileToString(INI_sFilename)
INI_sUpperContents$ = Upper$(INI_sContents) ; Speed up checks below
; Locate the SECTION, KEY and VALUE
INI_sValue$ = ""
INI_lSectionPos% = Instr(INI_sUpperContents, INI_sSection)
If (INI_lSectionPos <> 0) Then
INI_lKeyPos% = Instr(INI_sUpperContents, INI_sKey, (INI_lSectionPos + Len(INI_sSection) + 1))
If (INI_lKeyPos <> 0) Then
INI_lStartPos% = Instr(INI_sUpperContents, "=", (INI_lKeyPos + 1))
If (INI_lStartPos <> 0) Then
INI_lEndPos% = Instr(INI_sUpperContents, Chr$(0), (INI_lStartPos + 1))
If (INI_lEndPos <> 0) Then
; We have located the required INI VALUE!
INI_sValue = Trim$(Mid$(INI_sContents, INI_lStartPos + 1, (INI_lEndPos - INI_lStartPos - 1)))
; Now remove any leader/trailer quotes (") - ** OPTIONAL **
;If Left$(INI_sValue, 1) = Chr$(34) Then INI_sValue = Mid$(INI_sValue, 2)
;If Right$(INI_sValue, 1) = Chr$(34) Then INI_sValue = Mid$(INI_sValue, 1, (Len(INI_sValue) - 1))
End If
End If
End If
End If
; Return the value
If (INI_sValue <> "") Then Return INI_sValue Else Return INI_sDefault
End Function
Function INI_WriteValue%(INI_sAppName$, INI_sSection$, INI_sKey$, INI_sValue$)
; Returns: True (Success) or False (Failed)
INI_sSection = "[" + Trim$(INI_sSection) + "]"
INI_sUpperSection$ = Upper$(INI_sSection)
INI_sKey = Trim$(INI_sKey)
INI_sValue = Trim$(INI_sValue)
INI_sFilename$ = CurrentDir$() + "\" + INI_sAppName + ".ini"
; Retrieve the INI data (if it exists)
INI_sContents$= INI_FileToString(INI_sFilename)
; (Re)Create the INI file updating/adding the SECTION, KEY and VALUE
INI_bWrittenKey% = False
INI_bSectionFound% = False
INI_sCurrentSection$ = ""
INI_lFileHandle = WriteFile(INI_sFilename)
If INI_lFileHandle = 0 Then Return False ; Create file failed!
INI_lOldPos% = 1
INI_lPos% = Instr(INI_sContents, Chr$(0))
While (INI_lPos <> 0)
INI_sTemp$ =Trim$(Mid$(INI_sContents, INI_lOldPos, (INI_lPos - INI_lOldPos)))
If (INI_sTemp <> "") Then
If Left$(INI_sTemp, 1) = "[" And Right$(INI_sTemp, 1) = "]" Then
; Process SECTION
If (INI_sCurrentSection = INI_sUpperSection) And (INI_bWrittenKey = False) Then
INI_bWrittenKey = INI_CreateKey(INI_lFileHandle, INI_sKey, INI_sValue)
End If
INI_sCurrentSection = Upper$(INI_CreateSection(INI_lFileHandle, INI_sTemp))
If (INI_sCurrentSection = INI_sUpperSection) Then INI_bSectionFound = True
Else
; KEY=VALUE
lEqualsPos% = Instr(INI_sTemp, "=")
If (lEqualsPos <> 0) Then
If (INI_sCurrentSection = INI_sUpperSection) And (Upper$(Trim$(Left$(INI_sTemp, (lEqualsPos - 1)))) = Upper$(INI_sKey)) Then
If (INI_sValue <> "") Then INI_CreateKey INI_lFileHandle, INI_sKey, INI_sValue
INI_bWrittenKey = True
Else
WriteLine INI_lFileHandle, INI_sTemp
End If
End If
End If
End If
; Move through the INI file...
INI_lOldPos = INI_lPos + 1
INI_lPos% = Instr(INI_sContents, Chr$(0), INI_lOldPos)
Wend
; KEY wasn't found in the INI file - Append a new SECTION if required and create our KEY=VALUE line
If (INI_bWrittenKey = False) Then
If (INI_bSectionFound = False) Then INI_CreateSection INI_lFileHandle, INI_sSection
INI_CreateKey INI_lFileHandle, INI_sKey, INI_sValue
End If
CloseFile INI_lFileHandle
Return True ; Success
End Function
Function INI_FileToString$(INI_sFilename$)
INI_sString$ = ""
INI_lFileHandle% = ReadFile(INI_sFilename)
If INI_lFileHandle <> 0 Then
While Not(Eof(INI_lFileHandle))
INI_sString = INI_sString + ReadLine$(INI_lFileHandle) + Chr$(0)
Wend
CloseFile INI_lFileHandle
End If
Return INI_sString
End Function
Function INI_CreateSection$(INI_lFileHandle%, INI_sNewSection$)
If FilePos(INI_lFileHandle) <> 0 Then WriteLine INI_lFileHandle, "" ; Blank line between sections
WriteLine INI_lFileHandle, INI_sNewSection
Return INI_sNewSection
End Function
Function INI_CreateKey%(INI_lFileHandle%, INI_sKey$, INI_sValue$)
WriteLine INI_lFileHandle, INI_sKey + "=" + INI_sValue
Return True
End Function |
Comments
None.
Code Archives Forum