Click here to Skip to main content
Click here to Skip to main content

INI Class for .NET

, 9 Aug 2005 CC (ASA 2.5)
Rate this:
Please Sign up or sign in to vote.
Class for interfacing with INI files.

Sample Image - aejw_ini_class.jpg

Introduction

This is a class for reading and adjusting INI files. The class utilizes the WritePrivateProfileString and GetPrivateProfileString API calls. Written mainly for legacy support, as a lot applications still use INI files and although there is XML support native to .NET (".config" files), I tend to find that for some circumstances INI files are straightforward and more practical to use.

Using the code

  • Add the class file "cINI.cs" to your project / solution.
  • Declare and use the class.
    //Read value from INI
    aejw.cIni oIni = new aejw.cIni("C:\\INIFile.ini");
    string sRet = oIni.ReadValue("TheSection", 
                       "TheKey", "DefaultReturn");

Functions / Methods

The following examples require the object / class to be declared.

aejw.cIni oIni = new aejw.cIni("C:\\INIFile.ini");

Read Value

//Read value from INI
string sRet = oIni.ReadValue("TheSection", "TheKey", "");

Write Value

//Write value to INI
oIni.WriteValue("TheSection", "TheKey", "TheValue");

Remove Value

//Remove value from INI
oIni.RemoveValue("TheSection", "TheKey");

Read Sections

//Read sections from INI
Array oSections = new Array[0];
oIni.ReadSections(ref oSections);

Read Values (Value names)

//Read values from INI
Array oValues = new Array[0];
oIni.ReadValues(ref oValues);

About the code

Below is a general breakdown of how the code works...

  • Referring to the API function...

    All the functions at some stage use a API call. By reading the MSDN Platform SDK material, we get the C++ API call and behavior of the API function...

    DWORD GetPrivateProfileString(
        LPCTSTR lpAppName,
        LPCTSTR lpKeyName,
        LPCTSTR lpDefault,
        LPTSTR  lpReturnedString,
        DWORD   nSize,
        LPCTSTR lpFileName
    );

    Which loosely translates to... (I am using the term loosely on the bases that there are multiple ways of handling the parameters.)

    [DllImport("kernel32", SetLastError=true)]
    private static extern int GetPrivateProfileString(
        string pSection,
        string pKey,
        string pDefault,
        byte[] pValue,
        int    pBufferLen,
        string pFile
    );

    Make note of the LPTSTR to byte[] conversion. The LPTSTR refers to a pointer / reference in memory that the API function will write to, we are going to use a framework function later to collect the text.

  • Calling the API function...

    Once the API declaration has been added, we need to create a function to wrap the API function into a C# friendly function.

    private string z_GetString(string psSection, 
                               string psKey, string psDefault){
    
        //Prepare the default return and create 
        //a byte array to pass as a pointer
        string sRet=psDefault;
        byte[] bRet=new byte[255];
    
        //Call the API function, passing a Section name, value name, default value,
        //buffer length (length of the passed byte array) and the ini filename.
        int i=GetPrivateProfileString(psSection, psKey, 
                        psDefault, bRet, 255, ls_IniFilename);
    
        //As referred above we use a framework function 
        //to collect the string from the byte
        //array used as a pointer. Note the 'i' variable 
        //is the return from the API call, this
        //is passed to the text encoding as the total length of the return.
        sRet=System.Text.Encoding.GetEncoding(1252).GetString(bRet, 
                                             0,i).TrimEnd((char)0);
    
        return(sRet);
    
    }
  • Using the function...

    Now that we have a API declaration and friendly function, we can call the function at will...

    string sSetting=z_GetString("SectionName","ValueName","");
    string sSetting2=z_GetString("SectionName2", 
                                 "ValueName2","DefaultReturn");

History

  • 3rd August 2005 - build 0019
    • Wrote some more general documentation.
    • Changed class filename to 'cINI.cs'.
    • Corrected 'ReadSections' and 'ReadValues'. Rewrote 'z_GetString' function to correctly handle the text encoding and accept chr(0). (Thanks to 'yurij' for reporting the bug).
    • General small bug fixes and improvements.
  • 14th April 2005 - build 0018
    • Corrected issue when returning high ASCII characters, e.g.: 'åäö'
    • Tidied class and documents
  • 6th Feb 2004 - build 0016
    • Corrected bug in 'ReadValue', would return 'char(0)' to the length of the buffer after the value returned.
  • 5th Feb 2004 - build 0015
    • First build posted on CodeProject, based on previous code and dubbed 0015.

License

This article, along with any associated source code and files, is licensed under The Creative Commons Attribution-ShareAlike 2.5 License

Share

About the Author

aejw
Web Developer
New Zealand New Zealand
C#, VB.net (Web and forms), SQL Server, MySQL, ASP, Win32 API, ...
Site: aejw.com

Comments and Discussions

 
Questionfirst item of array filled by ReadValues always seems to be an empty string [modified] Pinmemberc_keen12-Mar-12 9:48 
GeneralThanks for the Class PinmemberDecad18-Jul-08 1:34 
GeneralRe: Thanks for the Class Pinmemberaejw20-Jul-08 15:53 
GeneralIf the value is Unicode,like simple chinese charset, there will be a bug Pinmemberlwlojj17-Jul-08 5:17 
GeneralRe: If the value is Unicode,like simple chinese charset, there will be a bug Pinmemberaejw20-Jul-08 15:52 
Questionhelp PinmemberMember 381377111-Feb-08 4:13 
AnswerRe: help Pinmemberaejw20-Jul-08 15:56 
QuestionHigh ASCII chars in value name Pinmemberz00z020-Mar-06 8:27 
AnswerRe: High ASCII chars in value name Pinmemberaejw2-May-06 17:57 
GeneralRe: High ASCII chars in value name Pinmemberz00z04-May-06 10:43 
GeneralNaming convebtions PinmemberGuido_d10-Aug-05 1:15 
GeneralRe: Naming convebtions Pinmemberaejw10-Aug-05 8:51 
GeneralUnicode PinmemberElder Benassi3-Aug-05 22:16 
GeneralRe: Unicode PinsussAnonymous-aejw6-Aug-05 1:49 
Generalerror in ReadSections Pinmemberyurij2-Aug-05 11:08 
GeneralRe: error in ReadSections Pinmemberaejw3-Aug-05 12:56 
QuestionNini?? PinmemberRabidKangaroo20-Apr-05 14:18 
AnswerRe: Nini?? PinmemberYinon Ehrlich14-Jun-05 21:18 
GeneralNative version PinmemberGuido_d20-Apr-05 3:14 
GeneralRe: Native version Pinmemberaejw20-Apr-05 9:28 
GeneralSymbols PinmemberSpeedhawk12-Apr-05 7:59 
GeneralRe: Symbols Pinmemberaejw14-Apr-05 17:32 
GeneralRe: Symbols PinmemberSpeedhawk16-Apr-05 0:42 
GeneralcINI0015.cs Pinmemberzoranl16-Mar-04 18:48 
GeneralRe: cINI0015.cs Pinmemberaejw18-Mar-04 0:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.141223.1 | Last Updated 10 Aug 2005
Article Copyright 2004 by aejw
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid