2 pagine in totale: <<Indietro 1 [2]
La parte principale è la chiamata all'API:
LenResult = GetPrivateProfileString(Section, Key, "", RetVal, RetVal.length, Filename)Section, Key, e Filename sono i valori passati al metodo Read, mentre RetVal è una variabile stringa che restituisce il valore letto nel file .ini. Da notare la peculiarità nella dichiarazione di RetVal
Dim RetVal As String = New String(" ",255)Questa dichiarazione non fa altro che creare una stringa composta da 255 ripetizioni del carattere "spazio", ed è necessario che sia così dichiarata perché il parametro lpReturnedString dell'api, cui corrisponde RetVal appunto, necessita di una variabile non vuota che contenga un numero di caratteri uguali o maggiori al numero di caratteri che verranno restituiti. Il carattere di spazio è stato scelto per comodità.
LenResult invece è un Integer che restituisce o il numero di caratteri che sono stati scritti in RetVal, oppure 0 se c'è stato un errore.
E il valore di LenResult ci serve per generare un'eccezione se avviene un errore durante la lettura; in questo caso infatti, verifichiamo anzitutto se il file .ini esiste oppure no in modo da scrivere un messaggio di errore specifico e invochiamo un' eccezione del tipo IniException.
Il metodo restituisce RetVal, eliminando però tutti gli spazi avanzati.
La procedura di scrittura Write è molto simile per struttura al metodo Read: è statica, richiama l'api di scrittura e gestisce l'errore. E' una procedura appunto, perché non deve restituire alcun valore.
Public Shared Sub Write(Filename As String, Section As String, Key As String, Value As String)
Dim LenResult as Integer
Dim ErrString as String
LenResult=WritePrivateProfileString (Section, Key, Value, Filename)
If LenResult=0 Then
If Not(File.Exists(Filename)) Then
ErrString="Impossibile trovare il file " & Filename
Else
ErrString="Impossibile eseguire l'operazione: accesso al file non consentito"
End If
Throw New IniException(ErrString)
End If
End SubConclusioni
Questa classe è stata ideata pensando di dover accedere ad un file .ini che con ogni probabilità risiede fuori del contesto dell'applicazione ASP.NET, è pertanto necessario assegnare a quel file i diritti di lettura/scrittura per l'utente ASP.NET prima di potervi accedere.
La gestione degli errori poteva essere più specializzata, implementando anche le api GetLastError per recuperare l'ultimo codice di errore generato dal sistema e FormatMessage per restituire il messaggio relativo al codice di errore; in effetti inizialmente la classe aveva anche queste due funzioni, poi facendo delle prove con un file .ini inesistente, ho visto che GetLastError in alcuni casi restituiva 0 il cui messaggio associato è "Operazione eseguita con successo". Il motivo è da ricercare nel fatto che tra il momento in cui si genera l'errore e il momento in cui si richiama GetLastError, ci possono essere altre chiamate ad API fatte internamente dall'applicazione, che andando a buon fine, aggiornano il valore dell'ultimo codice di errore generato a 0 cioè "nessun errore".
La spiegazione relativa alla dichiarazione della variabile RetVal nel metodo Read non è del tutto esatta: quello che avviene realmente è che all'API GetPrivateProfileString deve essere passato anche un intero nSize che specifica la dimensione in caratteri del buffer di ricezione, dimensione che deve corrispondere esattamente al numero di caratteri presenti nel parametro lpReturnedString; passando come parametri RetVal e RetVal.length si ha sempre la sicurezza i due valori coincidano. La dimensione del buffer invece, che nell'esempio è 255, è modificabile a piacere; è da tenere presente però che se scegliete un valore più piccolo rispetto alla lunghezza della stringa che recupererete dal file .ini, l'API la troncherà: quindi se nel file c'è un valore "c:\miadir" che è lungo 9 caratteri e voi specificate un buffer di 5, otterete come risultato della lettura "c:\mi".
La classe potrebbe essere ulteriormente estesa integrando anche le altre api per la gestione dei file .ini come ad esempio GetPrivateProfileInt, GetPrivateProfileSection, GetPrivateProfileSectionNames.
Approfondimenti
2 pagine in totale: <<Indietro 1 [2]
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Stampa
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
