Lo snippet di oggi permette di gestire semplicemente e con sicurezza un piccolo file di configurazione. Quando scriviamo un’applicazione, spesso ci serve memorizzare impostazioni o settaggi generali, locali o propri di un utente o di una sezione del programma. Ci sono vari modi per conservare le impostazioni del programma, in modo che vengano rese permanenti anche dopo la chiusura dell’applicazione: uno di questi utilizza un piccolo file di testo, di estensione INI, conosciuto e gestito fin dai tempi delle primissime versioni di Windows. Un file di estensione INI è un file di testo ASCII puro e contiene le informazioni di inizializzazione del programma; segue per convenzione alcune semplici regole: è suddiviso in sezioni, ogni sezione contiene una o più coppie chiave=valore.

Esempio:

[DATA]
jpg=Z:\WORKS\JPG
bmp=Z:\COMMON\DIR\BMP
documents=Z:\WORKS\STORAGE\DATA\BACKUP

[USERS]
user1=Pippo
user2=Topolino

Leggendo questo file di impostazioni, possiamo conservare le informazioni relative alle directory utilizzate dal programma per recuperare o salvare file di dati (immagini e documenti).
Nella routine che presentiamo sono semplificate al massimo le operazioni di scrittura e lettura delle informazioni nel file INI. Ci serviamo di due procedure API classiche, GetPrivateProfileString e WritePrivateProfileString. Entrambe le funzioni sono dedicate alla scrittura e alla lettura di un file INI.

Mediante Google sono disponibili in rete tonnellate di soluzioni sull’argomento. Quella che segue è un adattamento di un’idea semplice ma funzionale di Scott Lyerly che ringraziamo.

Option Explicit

'managing INI files
'from an idea of Scott Lyerly

'read INI
Public Declare Function GetPrivateProfileString Lib "kernel32" _
                 Alias "GetPrivateProfileStringA" _
                 (ByVal lpApplicationName As String, _
                   ByVal lpKeyName As String, _
                   ByVal lpDefault As String, _
                   ByVal lpReturnedString As String, _
                   ByVal nSize As Long, _
                   ByVal lpFileName As String) As Long
'write INI
Public Declare Function WritePrivateProfileString Lib "kernel32" _
                 Alias "WritePrivateProfileStringA" _
                 (ByVal lpApplicationName As String, _
                   ByVal lpKeyName As String, _
                   ByVal lpString As String, _
                   ByVal lpFileName As String) As Long

' +--------------------------------------------------+
' | INI manager                                      |
' | ini_manager ("r|w", "section", "key", <"value">) |
' +--------------------------------------------------+

Function ini_manager(action As String, section As String, key As String, _
                     Optional value As String) As String

' in questa costante memorizziamo il percorso e il nome del file ini da leggere/scrivere
Const INI_FILE As String = "path\inifilename.ini"

Dim sRetBuf As String
Dim iLenBuf As Integer
Dim sReturnValue As String
Dim lRetVal As Long
    
    On Error GoTo gest_err

    Select Case LCase(Left(action, 1))
    Case "r"            'READ INI
        ' alloca lo spazio necessario
        sRetBuf = Space(256)
        iLenBuf = Len(sRetBuf)

        ' recupera la sezione INI e la chiave cercata
        sReturnValue = GetPrivateProfileString(section, key, "", sRetBuf, _
                                               iLenBuf, INI_FILE)

        ' pulisce il valore di ritorno
        sReturnValue = Trim(Left(sRetBuf, sReturnValue))

        ' restituisce il valore cercato oppure "Error"
        If Len(sReturnValue) > 0 Then
            ini_manager = sReturnValue
        Else
            ini_manager = "Error"
        End If
    
    Case "w"            'WRITE INI
        ' ritorna errore se non esiste la sezione che si tenta di scrivere
        If Len(value) = 0 Then
            ini_manager = "Error"
        Else
            ' scrive il valore specificato nella chiave della sezione indicata
            If ini_manager("r", section, key) <> "Error" Then
                lRetVal = WritePrivateProfileString(section, key, value, _
                                                    INI_FILE)
            Else
                lRetVal = 0
            End If
            ' controlla se la procedura restituisce un valore di errore
            If lRetVal = 0 Then ini_manager = "Error" Else ini_manager = "Ok"
        End If
        
    Case Else
        ' solo w e r sono ammesse. Altre codifiche restituiscono errore
        ini_manager = "Error"
        
    End Select
    
    Exit Function
    
gest_err:
    MsgBox Err.Number & ": " & Err.Description, vbInformation, "INI Manager"
    
End Function

In questo adattamento del codice il percorso e il nome del file INI è codificato all’interno della routine. Quindi bisogna prestare attenzione, se si utilizza la procedura presentata, a modificare la costante INI_FILE in modo opportuno, perchè punti a un percorso/file esistente. Consiglio, in produzione, di avere un solo file di configurazione. Il loro numero è arbitrario e dipende dagli scopi e dalla complessità del programma ma occorre stare attenti a non perdersi nei file e nelle impostazioni. Con qualche piccola modifica il codice si può generalizzare perchè accetti un qualsiasi nome di file INI.

L’utilizzo è semplice: la sintassi della Function è ini_manager ("r|w", "section", "key", <"value">)

"r|w" sta per "read" (operazione di lettura) e "write" (operazione di scrittura)

"section" è la sezione del file da leggere o scrivere

"key" è la chiave (il valore a sinistra del segno di uguale)

"value" è il valore assegnato a quella chiave

Nei file INI possono essere inseriti dei commenti (preceduti da punto e virgola) ma le routine API Get- e WriteProfileString cancellano i commenti e lasciano solo le sezioni con le loro coppie chiave/valore.

Un utilizzo (basato sull’esempio fatto in questo articolo):

utente1 = ini_manager("r", "USERS", "user1")    'legge il valore di "user1" dalla sezione USERS : Pippo
ini_manager "w", USERS", "user1", "Paperino"    'scrive un nuovo valore di "user2" della sezione USERS 
Rispolveriamo i file di configurazione (gestione INI files)
Tag:         

Rispolveriamo i file di configurazione (gestione INI files)

Login Registrati
Stai vedendo 1 articolo (di 1 totali)
Login Registrati
Stai vedendo 1 articolo (di 1 totali)
Rispondi a: Rispolveriamo i file di configurazione (gestione INI files)
Gli allegati sono permessi solo ad utenti REGISTRATI
Le tue informazioni:



albatros54
albatros54 - 453 risposte

vecchio frac - 412 risposte

Marius44
Marius44 - 257 risposte

patel
patel - 257 risposte

Luca73
Luca73 - 185 risposte