create INI-File

Sinan Tuzcu

Well-Known Member
Licensed User
Longtime User
Helo,

i urgently need a function ,which can create INI-data and can read and write
the function i have here have failures,because i cant change the commands i put into INI-data,and it is only writing the same data input each time,so it is not replacable,not changable.

does somebody know a better solution for this?

B4X:
Sub wrINI(directory As String, fileINI As String, session As String, key As String, value As String)
   
   Dim nr As Int            ' numero delle righe lette dal file .INI
   Dim flgSESSION As Boolean   ' flag di supporto alla sessione (True = trovata)
   Dim flgKEY As Boolean      ' flag di supporto alla chiave (True = trovata)
   Dim rdTEXT As TextReader   ' oggetto stream per la lettura del file .INI
   Dim wrTEXT As TextWriter   ' oggetto stream per la scrittura del file .INI
   Dim rowtxt As String      ' riga di testo in lettura/scrittura
   Dim rKEY As String         ' riga contenente il nome e il valore della chiave
   Dim p As Int            '
   Dim k As String            '
   
   If File.Exists(directory, fileINI) = True Then ' verifica se il file .INI esiste...
      ' inizializza le variabili di controllo in uso:
      nr = 0
      flgSESSION = False
      flgKEY = False
      ' apre il file .INI in lettura:
      rdTEXT.Initialize(File.OpenInput(directory, fileINI))
      ' apre un file .INI temporaneo in scrittura:      
      wrTEXT.Initialize(File.OpenOutput(directory, "ini.tmp", False))
      ' lettura del file .INI riga per riga...
      rowtxt = rdTEXT.ReadLine
      ' loop per trovare la chiave nella sessione indicata:
      Do While rowtxt <> Null
         ' incrementa il contatore delle letture:
         nr = nr + 1
         If rowtxt <> "" Then ' se non si è raggiunta la fine del file .INI origine aperto in lettura...
            If rowtxt.SubString2(0, 0) = "[" Then ' si tratta di una sessione...               
               If flgSESSION = False Then ' verifica se si tratta della sessione da individuare...
                  If rowtxt.CompareTo("[" & session & "]") = 0 Then
                     ' la sessione è stata individuata:
                     flgSESSION = True
                  End If
                  If nr > 1 Then ' se la sessione da scrivere è successiva al primo in elenco...
                     ' inserisce una riga vuota per migliorare la lettura del file:
                     wrTEXT.WriteLine("")
                  End If
                  wrTEXT.WriteLine(rowtxt) ' scrive la sessione trovata senza apportare modifiche...
               Else
                  ' la sessione è cambiata...
                  flgSESSION = False
                  If flgKEY = False Then
                     ' ma non è stata trovata la chiave associata alla sessione...
                     wrTEXT.WriteLine(key & "=" & value) ' scrive la chiave e il suo valore come nuovi...
                     flgKEY = True
                     wrTEXT.WriteLine("")     ' inserisce una riga vuota per migliorare la lettura del file...
                     wrTEXT.WriteLine(rowtxt) ' scrive la sessione trovata successiva a quella della chiave appena scritta...
                     Exit ' la ricerca della chiave è terminata, esci dal loop...
                  Else
                     wrTEXT.WriteLine("")     ' inserisce una riga vuota per migliorare la lettura del file...
                     wrTEXT.WriteLine(rowtxt) ' scrive la sessione trovata senza apportare modifiche...
                  End If
               End If
            Else
               If rowtxt <> "" Then ' esclude le righe vuote e controlla se si tratta di una chiave...
                  ' verifica se si tratta della chiave da individuare:
                  p = rowtxt.IndexOf("=")
                  If p > -1 AND flgSESSION = True Then ' se è una chiave associata alla sessione...
                     k = rowtxt.SubString2(0, p)       ' estrae il nome della chiave...
                     If key.CompareTo(k) = 0 Then ' se il nome la chiave letta nel file .INI corrisponde al nome della chiave da individuare...
                        flgKEY = True           ' la chiave è stata individuata...
                        wrTEXT.WriteLine(key & "=" & value) ' scrive la chiave con il relativo valore...
                        Exit ' la ricerca della chiave è terminata, esci dal loop...
                     Else
                        ' non si tratta della chiave attesa, scrive la riga letta senza modificarla:
                        wrTEXT.WriteLine(rowtxt)
                     End If
                  Else
                     ' si tratta di una chiave appartenente ad un altra sessione, scrive la riga letta senza modificarla:
                     wrTEXT.WriteLine(rowtxt)
                  End If
               End If   
            End If
         End If
         rowtxt = rdTEXT.ReadLine ' legge una nuova riga dal file .INI origine...
      Loop
      ' copia le eventuali righe ancora da leggere dal file .INI origine in quello temporaneo: 
      Do While rowtxt <> Null
         rowtxt = rdTEXT.ReadLine     ' legge la riga dal file .INI origine...
         If rowtxt <> Null Then         ' se non si è raggiunta la fine del file .INI origine aperto in lettura...
            wrTEXT.WriteLine(rowtxt) ' scrive la riga appena letta nel file .INI temporaneo...            
         End If
      Loop
      ' chiude il file .INI usato in lettura:
      rdTEXT.Close
      If flgSESSION = False AND flgKEY = False Then ' la sessione e la chiave non sono stati trovati...
         wrTEXT.WriteLine("") ' inserisce una riga vuota per migliorare la lettura del file...
         wrTEXT.WriteLine("[" & session & "]") ' scrive l'identificativo della sessione...
         wrTEXT.WriteLine(key & "=" & value)   ' scrive la chiave con il relativo valore...
      End If
      wrTEXT.Close ' chiude il file .INI temporaneo usato in scrittura...
   Else
      File.MakeDir(File.DirRootExternal, "inifiles")
      ' il file .INI non esiste quindi lo si crea con la sola sessione e con l'unica chiave:
      wrTEXT.Initialize(File.OpenOutput(directory, fileINI, False))
      ' scrive l'identificativo della sessione:
      wrTEXT.WriteLine("[" & session & "]")
      ' scrive la chiave con il relativo valore:
      wrTEXT.WriteLine(key & "=" & value)
      ' chiude il file .INI:
      wrTEXT.Close
   End If

   If File.Exists(directory, "ini.tmp") = True Then ' se il file .INI temporaneo esiste...
      If File.Exists(directory, fileINI) = True Then ' se esiste il file .INI origine...
         File.Delete(directory, fileINI)          ' lo si elimina...
      End If
      ' sostituisce il file .INI originale con quello temporaneo:
      File.Copy(directory, "ini.tmp", directory, fileINI)
      ' elimina il file .INI temporaneo:
      File.Delete(directory, "ini.tmp")
   End If   
   
End Sub
 

Amalkotey

Active Member
Licensed User
Longtime User
Hello,

Last year I have also tried to use this code to store data, with the same result. Accordingly, I have switched to the storage in XML files. For saving you the XMLBuilder.bas with XMLBuilder libery use. To retrieve the information you are using XMLSax then.
 
Upvote 0
Top