[C#] Leggere un file di configurazione

Può capitare di dover caricare le impostazioni di un programma da un file di testo…

vediamo come fare utilizzando anche le regular expression.

Il file di log è fatto seguendo questo schema:

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]#
# HOW TO USE CONFIG FILE
#
# PARAM = "value"
# PARAM = ‘value’
#
# MAIL CONFIGURATION
#
MAIL_SMTP = ‘smtp.server.com’
MAIL_FROM  = "assistenza@server.com"
MAIL_SUBJECT = ‘[IMPORTANTE] Avviso automatico’
#
# DB CONFIGURATION
#
DB_PROCEDURE = ‘nomeprocedura’
DB_CONN_STRING = ‘Data Source=XX;Password=XX;…..’
#
# FILE CONFIGURATION
#
LOG_FILE_H1 = ‘Z:\\TEMP\\file_1.log’
LOG_FILE_H2 = ‘Z:\\TEMP\\file_2.log’
LOG_FILE_FULL = ‘unique.log'[/code]

Bene, non resta ora che costruirci la nostra classe!

Innanzitutto creare una comodissima ENUM con i valori accettati dal vostro file di configurazione.
Ad esempio:

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]{
MAIL_SMTP,
MAIL_FROM,
MAIL_SUBJECT,
DB_PROCEDURE,
DB_CONN_STRING,
LOG_FILE_H1,
LOG_FILE_H2,
LOG_FILE_FULL
};[/code]

Fatta la nostra ENUM, effettuiamo un paio di controlli sui commenti e sul testo da prendere. Vedremo dopo come leggere il tutto.

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]private static bool isComment(string line)
{
if (line.StartsWith("#")) return true;
return false;
}

private static string getContent(string line)
{
try
{
string pattern = "(\"[^\"]*\")|(‘[^\r]*)(\r\n)?";
Regex re = new Regex(pattern);
Match res = re.Match(line);</code>

return res.Value.Replace("’", "");
}
catch { return null; }
}[/code]

Come si nota, l’espressione regolare

"(\"[^\"]*\")|('[^\r]*)(\r\n)?"

serve a prendere il valore contenuto tra apici, sia singoli che doppi.
Comodo?

Ecco qui, iniziamo a leggere il nostro file con un semplice StreamReader.

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]string line = string.Empty;
StreamReader confF = new StreamReader("file.dat");
while ((line = confF.ReadLine()) != null)
{
/* salto se è un commento */
if (isComment(line)) continue;/* controllo se la parola nel file corrisponde
/*  a qualcuna della mia lista */
foreach (AccettableStrings item in Enum.GetValues(typeof(AccettableStrings)))
if (line.StartsWith(item.ToString()))
{
/* trovata, la salvo correttamente */
fillAll(item.ToString(), line);
break;
}
}[/code]

la salva correttamente? Si si, ecco qui:

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]private static void fillAll(string param, string line)
{
switch (param)
{
case "MAIL_SMTP": c_smtp = getContent(line); break;
case "MAIL_FROM": c_mail_from = getContent(line); break;[…] etc etc […]}
}
}[/code]

Tutto qui, abbastanza semplice e comodo!

Scarica da qui la classe completa con il file di configurazione di esempio.

 

Alberto Pasca

Software engineer @ Pirelli & C. S.p.A. with a strong passion for mobile  development, security, and connected things.