C# - INI állomány konvertálása XML formátumba

forráskód letöltése
Az .INI kiterjesztésű állományok speciális konfigurációs fájlok, melyeket – főleg a régebben íródott – alkalmazások használnak alapvető beállításaiknak tárolására. A mai elvárásoknak azonban talán jobban megfelel egy XML alapú tárolási forma. Talán ezért is találunk a .NET osztálykönyvtárában csak az XML-alapú információ feldolgozásához szükséges osztályokat. Cikkünkben elkészítünk egy komponenst, melynek segítségével képesek vagyunk egy tetszőleges INI állomány tartalmát XML állományba konvertálni.
A mellékelt példa két projektet tartalmaz, melyek egyike a konvertáló komponenst, a másik az azt felhasználó alkalmazást rejti. Lássuk a megvalósítás részleteit.
ICLibrary projekt
A komponens Convert metódus a végzi el a megadott INI állomány adatainak konvertálását XML állományba. Az INI és a generálandó XML állományok neveit az INIFile és az XMLFile property-kben kell megadni.
A konvertáláskor két API metódust is felhasználunk, mely egyike a GetPrivateProfileSectionNames metódus. Deklarációja a következő:
GetPrivateProfileSectionNames
Osztály:
int GetPrivateProfileSectionNames(
byte[] lpReturnedString, int nSize, string lpFileName
);
A metódus egy tömbben visszaadja a megadott INI állomány bejegyzéseinek nevét. Egy-egy bejegyzés a [] jelek között található.
Paraméterek
byte[] lpReturnedString
A tömb, mely a neveket tartalmazza.
int nSize
A tömb méretét megadó egész szám.
string lpFileName
A feldolgozandó INI állomány neve. Amennyiben ezt NULL értékre választjuk, akkor a metódus a Win.ini állományt keresi a Windows rendszermappájában.
Visszatérési érték
Amennyiben a művelet sikeres volt, az eredmény a tömbbe kiírt karakterek számát adja vissza.
A másik metódus a GetPrivateProfileSection, melynek deklarációja a következőképpen adható meg.
GetPrivateProfileSection
Osztály:
int GetPrivateProfileSection(
string lpAppName, byte[]lpReturnedString, intnSize, stringlpFileName
)
A megadott INI állomány megadott szegmenséből adja vissza az összes kulcs-érték párt.
Paraméterek
string lpAppName
Itt kell megadni a szegmens nevét.
byte[]lpReturnedString
A tömb tartalmazza az eredményhalmazt.
intnSize
A tömb mérete.
stringlpFileName
A feldolgozandó INI állomány neve. Amennyiben ezt NULL értékre választjuk, akkor az állományt a metódus a Windows rendszermappájában keresi.
Visszatérési érték
Amennyiben a művelet sikeres volt, az eredmény a tömbbe kiírt karakterek számát adja vissza.
A metódusok menedzselt deklarációit a Win32 osztályban helyeztük el.
A Convert metódusban azzal indítunk, hogy generálunk egy XML állománynevet, amennyiben nem adtunk meg ilyet. Ezt az INI állomány nevéből és elérési útvonalából képezzük.
if (xmlfile.Length == 0)
{
  xmlfile = Path.Combine(Path.GetDirectoryName(inifile),String.Format("{0}.xml", Path.GetFileNameWithoutExtension(inifile)));
}
Ezt követően kigyűjtjük a szegmensneveket az INI állományból. Ehhez egy FOR ciklusra van szükség, melyben meghívhatjuk a GetPrivateProfileSectionNames metódust.
for(max=BUFFER_SIZE/2,size=max;size!=0&&size>=(max-2);max*=2)
{
  b = new byte[max];
  size = Win32.GetPrivateProfileSectionNames(b,max,inifile);
}
Majd egy újabb ciklusban feldolgozzuk a GetPrivateProfileSection metódus meghívása után megkapott neveket és értékeket, beírjuk azokat az XML-be.
A művelet eredményeképpen előáll egy olyan XML, mely minden bejegyzés nevével nyit egy főcsomópontot, és egy-egy alcsomópont reprezentálja a bejegyzéseket névvel és értékkel. Ezeket a NAME és a VALUE attribútumokban helyeztük el.
Az alábbi INI bejegyzést találjuk az állomány elején:
[Main]
Version=1.0
Developer=Animare Software
Ennek XML-beli megvalósulása a következő:
<Section Name="Main">
  <Setting Name="Version" Value="1.0" /> 
  <Setting Name="Developer" Value="Animare Software" /> 
</Section>
ICClient projekt
Az alkalmazás Form-ján megtalálható TabControl első füle alatt elvégezhetjük a konverziót a szükséges adatok megadása után, majd az állományok tartalmát rögtön meg is nézhetjük a másik fül alatt található szövegmezőkben.
A komponens metódusának meghívása igen egyszerű, a következőképpen történik:
icComponent1.INIFile = textBox1.Text;
icComponent1.XMLFile = textBox2.Text;
if (icComponent1.Convert())
{
  ...