Con l'avvento di XML pensare di utilizzare ancora i vecchi file .ini per memorizzare dei parametri di configurazione di un' applicazione ha un sapore veramente anacronistico. Può succedere però di avere la necessità di accedere ad un file .ini già esistente da una nostra applicazione ASP.NET o winforms.
Il caso più banale ad esempio è quello di un' applicazione ASP.NET per una intranet che deve estendere le funzionalità di un programma preesistente, scritto ad esempio in VB6, che ha i parametri di configurazione come path dove salvare i documenti o l'indirizzo IP di SQL Server, memorizzati in un file .ini. La lettura diretta dei parametri nel file, anziché copiare i dati ad esempio nel web.config, ci risolve il problema di tenere sincronizzati i due file: se un utente modifica un parametro nel file .ini, l'applicazione ASP.NET sarà automaticamente aggiornata.
Le API
La parola API ha sicuramente un suono abbastanza sinistro per un programmatore che viene dal VB6 o da Classic ASP: muoversi in quella giungla di costanti, tipi e dichiarazioni (che oltretutto hanno anche più versioni?) non è affatto una cosa banale. Per fortuna con .NET non ci sono più di questi problemi: le classi di base sono talmente tante che è possibile accedere tramite esse a quasi tutte le API di Windows. Appunto, quasi tutte.
Microsoft ha pensato che non fosse necessario creare una classe di base per la gestione dei file .ini (ma esistono ad esempio due classi di base Registry e RegistryKey in Microsoft.Win32 per la gestione delle chiavi del registro di configurazione) e quindi se vogliamo accedere ad un file .ini in lettura/scrittura, o trattiamo il file come un normale file di testo e ci implementiamo tutta la struttura per il parsing, oppure ricorriamo a due api: GetPrivateProfileString e WritePrivateProfileString.
In .NET è ancora possibile ricorrere all'utilizzo delle API come si faceva in VB6 utilizzando l'istruzione Declare oppure tramite l'attributo DllImport; quello che ci proponiamo di fare è di creare una classe che integri queste due API e che sia utilizzabile sia in applicazioni ASP.NET che winforms.
Le Classi
Le classi che implementeremo sono due: la classe FileIni, in cui dichiareremo le api e due metodi Read e Write, la classe IniException per gestire le eccezioni generate da FileIni.
Partiamo prima da questa classe che poi ci servirà all'interno dell'altra:
Public Class IniException Inherits Exception Public Sub New() End Sub Public Sub New(message As String) MyBase.New(message) End Sub Public Sub New(message As String, inner As Exception) MyBase.New(message, inner) End Sub End Class
Come si vede, la classe non fa altro che ereditare dalla classe Exception e dichiarare tre costruttori che richiamano altrettanti costruttori della classe di base. La utilizzeremo per gestire le nostre eccezioni personalizzate.
Nella classe FileIni invece sta tutto quello che ci serve per l'accesso al file .ini.
Anzitutto dichiariamo le due api:
Private Declare Auto Function GetPrivateProfileString Lib "kernel32.dll" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer Private Declare Auto Function WritePrivateProfileString Lib "kernel32.dll" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
La dichiarazione è simile a quella che facevamo in VB6, salvo per la presenza dell'istruzione Auto che serve per convertire tutte le stringhe in base alle regole di Common Language Runtime secondo il nome del metodo o l'alias, se specificato.
La classe non prevede campi o proprietà, quindi i suoi metodi non dovranno recuperare valori da campi di istanze della classe: queste caratteristiche suggeriscono di rendere la classe statica, in modo da non dover specificare alcun costruttore ed accedere ai metodi semplicemente scrivendo
FileIni.Metodo(parametri)
Veniamo ora al metodo Read per la lettura di un valore all'interno del file:
Public Shared Function Read(Filename As String, Section As String, Key As String) As String Dim Result as String Dim RetVal As String = New String(" ",255) Dim LenResult As Integer Dim ErrString as String LenResult = GetPrivateProfileString(Section, Key, "", RetVal, RetVal.length, Filename) If LenResult=0 Then If Not(File.Exists(Filename)) Then ErrString="Impossibile trovare il file " & Filename Else ErrString="Impossibile eseguire l'operazione: la sezione o la chiave sono errate oppure l'accesso al file non è consentito" End If Throw New IniException(ErrString) End If Result=RetVal.subString(0,LenResult) Return Result End Function
Come anticipato il metodo è dichiarato statico tramite l'istruzione Shared e accetta in ingresso tre parametri: il percorso e nome del file, il nome della sezione (quella racchiusa tra [ ]) e il nome della chiave (la stringa a sinistra dell'uguale) da ricercare all'interno del file.
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.