C# - INI állományok kezelése C#-ból

forráskód letöltése
Régebbi Windows verzióknál gyakori volt, de még manapság is előfordul olyan szöveges konfigurációs állományok használata, melyek az alábbi formátumot követik:
[Section]
Key=Value
A .NET-ben minden az XML körül forog és ez így helyes is, de ha programunk - akár milyen okból is - kénytelen használni, kezelni INI állományokat, akkor a CLR-ben ehhez nem kapunk segítséget, a feladatot pedig meg kell oldalunk valahogy.
E cikkben készítünk egy osztályt, melyet használva könnyedén kezelhet alkalmazásunk INI állományokat.
A megoldáshoz találunk két olyan függvényt a Windows API-ben, melyek elvégzik a munka nagy részét, így nekünk csak egy osztály létrehozása a feladatunk.
Készítsünk első lépésként egy belsőleg használt osztályt, melyben deklaráljuk a két Windows függvényt, megadva, hogy azok a Kernel32.dll-ben kaptak helyet. E két függvény felhasználásával képesek leszünk INI állományokba írni, illetve onnan kiolvasni adatokat.
  internal class Win32
  {
    [DllImport("kernel32")]
    public static extern long WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
    [DllImport("kernel32")]
    public static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
  }
Ezek után már jöhet is az IniFile nevű osztály készítése.
  public class IniFile
  {
    private string fileName;
Az osztály konstruktorában kell majd megadnunk annak az állománynak a nevét, elérési útját, melyet kezelni akarunk. Itt nincs is más teendőnk, mint a kapott értéket eltárolni a későbbi felhasználás érdekében.
    public IniFile(string FileName)
    {
      fileName=FileName;
    }
Létrehozunk két függvényt, melyek meghívják a szükséges Win API függvényeket. A WriteValue segítségével tudunk majd adatot írni az INI állományba. Ennek három paramétere van: a Section-ban adhatjuk meg, hogy melyik szekcióba írjuk az adatokat, a Key lesz a tárolandó adat megnevezése, míg a Value a tárolandó adat. Ez utóbbi object típusú, így bármilyen típusú adat tárolását elvégezhetjük, feltéve, hogy az konvertálható sztringgé. Mivel az INI állomány egy szöveges típusú állomány, így ott csak sztringek tárolhatók.
    public void WriteValue(string Section, string Key, object Value)
    {
      Win32.WritePrivateProfileString(Section, Key, Value.ToString(), fileName);
    }
A másik függvényünk lesz a ReadValue, mellyel kiolvashatjuk a tárolt adatokat. Itt szintén három paramétert kell megadni: a Section és Key egyezik az előbbivel, míg a Default paraméterben megadott adat akkor kerül felhasználásra, ha a kiolvasandó adat nem szerepel az INI állományban. Ekkor a Default paraméterben megadott érték kerül visszaadásra a függvény által.
    public string ReadValue(string Section, string Key, string Default)
    {
      StringBuilder sb = new StringBuilder(512);
      Win32.GetPrivateProfileString(Section, Key, Default, sb, 512, fileName);
      return sb.ToString();
    }
  }