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.