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?
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