INIWriter --> Automatisches Schreiben von INI Dateien

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

M0rgenstern

Betreff: INIWriter --> Automatisches Schreiben von INI Dateien

BeitragSo, März 06, 2011 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.
Ich habe sowas im Codearchiv nicht direkt gefunden und da ichs grade geschrieben habe setze ich es einfach mal rein.
Undzwar macht das Programm folgendes: Es schreib INI Dateien.
Dabei erweitert es jedoch bestehende Dateien.
Das ist ganz praktisch, wenn man INI Dateien hat, die vom Grundaufbau gleich bleiben, wo aber z.B. neue Werte zugewiesen werden.
Ich benutze das momentan zum Beispiel für die Tastaturbelegung eines Spiels.
Die Nutzung ist ganz einfach: Man ruft die WriteCompleteFile Funktion auf. Der erste Parameter steht für die Sektion, also z.B. [Spieler1]. Der zweite Parameter gibt die Variable, also das Suchwort das links von dem = steht, z.B. Geld. Das = dahinter wird automatisch angefügt, darf also nicht im Parameter übergeben werden.
Der dritte Parameter gibt den Wert an, also das was rechts von dem = steht.
Der letzte Parameter gibt einfach den Pfad der INI Datei an.
Das Programm erstellt auch eine neue Datei, selbst wenn eine mit dem Namen nicht vorhanden sein sollte.

Also, hier der Code:
BlitzMax: [AUSKLAPPEN]
Type TInput 'Type für die ausgelesenen Zeilen
Global List:TList = New TList
Field sLine:String

Method New()
List.Addlast(Self) 'Automatisch der Liste hinzufügen
End Method

Function Create:TInput(sInput:String) 'Einfacher Konstruktor
Local Input:TInput = New TInput
Input.sLine = sINput
Return Input
End Function
End Type


Function WriteCompleteFile(sSection:String, sSearchTerm:String, sValue:String, sFile:String) 'Liest die komplette Datei aus und schreibt dann eine neue
Local sLine:String, fileINI:TStream
TInput.List.Clear() 'Erstmal die Liste leeren, damit keine alten Relikte darin stecken

If FileType(sFile) = 1 Then 'Die Datei kann nur ausgelesen werden, wenn sie vorhanden ist, ansonsten gehts direkt mit dem Schreiben weiter
fileINI = ReadFile(sFile)
While Not Eof(fileINI)
sLine = ReadLine(fileINI)
TInput.Create(sLine) 'Einfach die Zeile der Liste hinzufügen
Wend
CloseFile(fileINI)
EndIf
WriteInFile(sSection, sSearchTerm, sValue, sFile)

End Function

Function GetLeftPart:String(sLine:String) 'Gibt die Bezeichnung, also das was links vom "=" steht zurück
If Instr(sLine, "=") > 0 Then
Return Left(sLine, Instr(sLine, "=") - 1)
Else
Return ""
EndIf
End Function

Function WriteInFile(sSection:String, sSearchTerm:String, sValue:String, sFile:String) 'Die Funktion schreibt dann alles wieder in die Datei
sSection = "[" + sSection + "]"
Local LastPossible:TInput = Null
Local bHasSection:Byte = False, bHasTerm:Byte = False

For Local Inp:TInput = EachIn TInput.List 'Alles in der Liste
If (Left(Inp.sLine, 1) = "[") Then 'Neue Sektion?
If bHasSection Then 'Wenn die gesuchte Sektion schon gefunden wurde
If Not bHasTerm Then 'Aber die gesuchte Variable noch nicht
If Lastpossible = Null Then 'Nur wenn Lastpossible noch nicht ersetzt wurde
LastPossible = Inp 'Dann ist eine Zeile davor die letzt mögliche Stelle für einen neuen Eintrag
EndIf
EndIf
EndIf
EndIf
If (Lower(Inp.sLine) = Lower(sSection)) Then 'Wurde die gesuchte Sektion gefunden?
bHasSection = True
EndIf
If (Lower(Trim(GetLeftPart(Inp.sLine))) = Lower(sSearchTerm)) Then 'Gesuchte Variable?
If bHasSection Then 'in der richtigen Sektion?
Inp.sLine = sSearchTerm + "=" + sValue 'Dann einfach den Wert an der Stelle abändern
bHasTerm = True
EndIf
EndIf
Next

If bHasSection Then 'Sektion gefunden?
If Not bHasTerm Then 'Aber die Variable nicht?
If LastPossible <> Null Then 'LastPossible ist null wenn keine Sektion mehr folgte
Local NewInp:TInput = TInput.Create(sSearchTerm + "=" + sValue) 'Neue Zeile erstellen
TInput.List.Remove(NewInp) 'Und diese vom Ende der Liste entfernen, da sie dort falsch wäre
Local Link:TLink = TInput.List.FindLink(LastPossible) 'Hier beginnt die neue Sektion
TInput.List.InsertBeforeLink(NewInp, Link) 'Die Zeile eine Reihe vor der neuen Sektion, also noch in der richtigen Sektion einfügen
Else
Tinput.Create(sSearchTerm + "=" + sValue) 'Ansonsten gehört das ganze noch zur ersten Sektion, also einfach einfügen
EndIf
EndIf
Else 'Wenn keine Sektion vorhanden war
TInput.Create(ssection ) 'Eine neue erstellen
TinPut.Create(ssearchterm + "=" + sValue) 'Und auch die Reihe erstellen
EndIf

Local INIFile:TStream = WriteFile(sFile)
For Local InpNew:TInput = EachIn TInput.List
WriteLine(INIFile, InpNew.sLine) 'Jeden Eintrag in die Datei schreiben
Next
CloseFile(INIFile)
End Function


Und hier ein kurzes Beispielprogramm:
BlitzMax: [AUSKLAPPEN]
WriteCompleteFile("Player1", "Points", "100", "Player.ini")
WriteCompleteFile("Player1", "Power", "30", "Player.ini")
WriteCompleteFile("Player2", "Points", "200", "Player.ini")
WriteCompleteFile("Player2", "Power", "50", "Player.ini")
WriteCompleteFile("Player1", "Games", "10", "Player.ini")


Könnt ja was dazu schreiben, wenn ihr mögt.

lg, M0rgenstern
  • Zuletzt bearbeitet von M0rgenstern am So, März 06, 2011 22:11, insgesamt 2-mal bearbeitet

das wurgel

BeitragSo, März 06, 2011 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
M0rgenstern hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
      If  (Left(Inp.sLine, 1) = "[") Then   'Neue Sektion?
         If bHasSection Then 'Wenn die gesuchte Sektion schon gefunden wurde
            If Not bHasTerm Then 'Aber die gesuchte Variable noch nicht
               LastPossible = Inp 'Dann ist eine Zeile davor die letzt mögliche Stelle für einen neuen Eintrag
            EndIf
         EndIf
      EndIf

Das stimmt nur, wenn die Sektion vor der neuen Sektion die richtige war. Es könnte aber auch z.B. die vorletzte gewesen sein.

Deshalb wird dieser Code hier nicht richtig funktionieren:
Code: [AUSKLAPPEN]
WriteCompleteFile("Player1", "Points", "100", "Player.ini")
WriteCompleteFile("Player1", "Power", "30", "Player.ini")
WriteCompleteFile("Player2", "Points", "200", "Player.ini")
WriteCompleteFile("Player2", "Power", "50", "Player.ini")
WriteCompleteFile("Player3", "Points", "300", "Player.ini")
WriteCompleteFile("Player3", "Power", "70", "Player.ini")
WriteCompleteFile("Player1", "Games", "10", "Player.ini")


edit:
So funktionierts:
Code: [AUSKLAPPEN]
               If Not LastPossible Then 'Und wenn die Stelle noch nicht gefunden wurde
                  ThenLastPossible = Inp 'Dann ist eine Zeile davor die letzt mögliche Stelle für einen neuen Eintrag
               EndIf

M0rgenstern

BeitragSo, März 06, 2011 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, hast Recht.
Habs behoben durch eine Zeile.
Vielen Dank.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group