Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Classi utili - File *.ini

C# > C# - Classi utili

Classe per leggere e scrivere i file *.ini
   •   La classe seguente è tratta da: http://bytes.com/topic/net/insights/797169-reading-parsing-ini-file-c.
   •   I file *.ini sono file di configurazione di programmi, oramai non più utilizzati perché sostituiti da file *.xml.
   •   È però possibile trovare vecchi programmi che utilizzano i file *.ini; la classe seguente permette di leggere e scrivere con facilità questi file.
   •   I file *.ini sono organizzati in 'sezioni'
racchiuse tra parentesi quadre e coppie di 'chiave-valore'.
   •   Esempio:

[SEZIONE1]

CHIAVE1=Valore1

CHIAVE2=Valore2


La classe
   •   Questa è la classe.

public class IniParser
{
   
private Hashtable keyPairs = new Hashtable();
   
private String iniFilePath;

   
private struct SectionPair
   {
       
public String Section;
       
public String Key;
   }

   
/// <summary>
   /// Opens the INI file at the given path and enumerates the values in the IniParser.
   /// </summary>
   /// <param name="iniPath">Full path to INI file.</param>
   public IniParser(String iniPath)
   {
       
TextReader iniFile = null;
       
String strLine = null;
       
String currentRoot = null;
       
String[] keyPair = null;

       iniFilePath = iniPath;

       
if (File.Exists(iniPath))
       {
           
try
           {
               iniFile =
new StreamReader(iniPath);

               strLine = iniFile.ReadLine();

               
while (strLine != null)
               {
                   strLine = strLine.Trim().ToUpper();

                   
if (strLine != "")
                   {
                       
if (strLine.StartsWith("[") && strLine.EndsWith("]"))
                       {
                           currentRoot = strLine.Substring(1, strLine.Length - 2);
                       }
                       
else
                       {
                           
if (strLine.StartsWith("'"))
                           {
                               
// assuming comments start with the apostrophe do nothing
                           }
                           
else
                           {
                               keyPair = strLine.Split(
new char[] { '=' }, 2);

                               
SectionPair sectionPair;
                               
String value = null;

                               
if (currentRoot == null)
                                   currentRoot =
"ROOT";

                               sectionPair.Section = currentRoot;
                               sectionPair.Key = keyPair[0];

                               
if (keyPair.Length > 1)
                                   value = keyPair[1];

                               keyPairs.Add(sectionPair, value);
                           }
                       }
                   }

                   strLine = iniFile.ReadLine();
               }

           }
           
catch (Exception ex)
           {
               
throw ex;
           }
           
finally
           {
               
if (iniFile != null)
                   iniFile.Close();
           }
       }
       
else
           throw new FileNotFoundException("Unable to locate " + iniPath);

   }

   
/// <summary>
   /// Returns the value for the given section, key pair.
   /// </summary>
   /// <param name="sectionName">Section name.</param>
   /// <param name="settingName">Key name.</param>
   public String GetSetting(String sectionName, String settingName)
   {
       
SectionPair sectionPair;
       sectionPair.Section = sectionName.ToUpper();
       sectionPair.Key = settingName.ToUpper();

       
return (String)keyPairs[sectionPair];
   }

   
/// <summary>
   /// Enumerates all lines for given section.
   /// </summary>
   /// <param name="sectionName">Section to enum.</param>
   public String[] EnumSection(String sectionName)
   {
       
ArrayList tmpArray = new ArrayList();

       
foreach (SectionPair pair in keyPairs.Keys)
       {
           
if (pair.Section == sectionName.ToUpper())
               tmpArray.Add(pair.Key);
       }

       
return (String[])tmpArray.ToArray(typeof(String));
   }

   
/// <summary>
   /// Adds or replaces a setting to the table to be saved.
   /// </summary>
   /// <param name="sectionName">Section to add under.</param>
   /// <param name="settingName">Key name to add.</param>
   /// <param name="settingValue">Value of key.</param>
   public void AddSetting(String sectionName, String settingName, String settingValue)
   {
       
SectionPair sectionPair;
       sectionPair.Section = sectionName.ToUpper();
       sectionPair.Key = settingName.ToUpper();

       
if (keyPairs.ContainsKey(sectionPair))
           keyPairs.Remove(sectionPair);

       keyPairs.Add(sectionPair, settingValue);
   }

   
/// <summary>
   /// Adds or replaces a setting to the table to be saved with a null value.
   /// </summary>
   /// <param name="sectionName">Section to add under.</param>
   /// <param name="settingName">Key name to add.</param>
   public void AddSetting(String sectionName, String settingName)
   {
       AddSetting(sectionName, settingName,
null);
   }

   
/// <summary>
   /// Remove a setting.
   /// </summary>
   /// <param name="sectionName">Section to add under.</param>
   /// <param name="settingName">Key name to add.</param>
   public void DeleteSetting(String sectionName, String settingName)
   {
       
SectionPair sectionPair;
       sectionPair.Section = sectionName.ToUpper();
       sectionPair.Key = settingName.ToUpper();

       
if (keyPairs.ContainsKey(sectionPair))
           keyPairs.Remove(sectionPair);
   }

   
/// <summary>
   /// Save settings to new file.
   /// </summary>
   /// <param name="newFilePath">New file path.</param>
   public void SaveSettings(String newFilePath)
   {
       
ArrayList sections = new ArrayList();
       
String tmpValue = "";
       
String strToSave = "";

       
foreach (SectionPair sectionPair in keyPairs.Keys)
       {
           
if (!sections.Contains(sectionPair.Section))
               sections.Add(sectionPair.Section);
       }

       
foreach (String section in sections)
       {
           strToSave += (
"[" + section + "]\r\n");

           
foreach (SectionPair sectionPair in keyPairs.Keys)
           {
               
if (sectionPair.Section == section)
               {
                   tmpValue = (
String)keyPairs[sectionPair];

                   
if (tmpValue != null)
                       tmpValue =
"=" + tmpValue;

                   strToSave += (sectionPair.Key + tmpValue +
"\r\n");
               }
           }

           strToSave +=
"\r\n";
       }

       
try
       {
           
TextWriter tw = new StreamWriter(newFilePath);
           tw.Write(strToSave);
           tw.Close();
       }
       
catch (Exception ex)
       {
           
throw ex;
       }
   }

   
/// <summary>
   /// Save settings back to ini file.
   /// </summary>
   public void SaveSettings()
   {
       SaveSettings(iniFilePath);
   }
}

Esempio di utilizzo della classe
   •   Nell'esempio seguente, viene inizializzato un oggetto che permette di interagire con il file *.ini.
   •   Nelle righe seguenti vengono lette, scritte e cancellate alcune chiavi.

   // Imposta il file INI
   IniParser fileIni = new IniParser(@"C:\test.ini");

   
// Legge una chiave
   string s = fileIni.GetSetting("SEZIONE", "CHIAVE");

   
// Aggiunge/Modifica una chiave
   fileIni.AddSetting("Sezione", "Chiave", "Valore");
   fileIni.SaveSettings();

   
// Elimina una chiave
   fileIni.DeleteSetting("Sezione", "Chiave"
);
   fileIni.SaveSettings();


  • Si ponga attenzione al fatto che la classe converte in maiuscolo le 'Chiavi' e i 'Valori'. Questo fa sì che il suo utilizzo è limitato ai casi nei quali l'applicazione non distingue le stringhe maiuscole dalle minuscole.
  • Altra limitazione della classe è che funziona solo se non ci sono spazi tra la chiave e il valore.
  • Quindi, con riferimento alle righe seguenti, la CHIAVE1 è letta correttamente dal metodo GetSetting(), la CHIAVE2 non lo è.

[SEZIONE1]
CHIAVE1=Valore1
CHIAVE2 = Valore2
© 2020 Carlo Vecchio
Torna ai contenuti