Schreiben/Auslesen von Daten

Einleitung

Für das schreiben/auslesen von Daten verwenden wir hauptsächlich die File/Directory Bibliotheken. Mit File können wir Dateien erstellen, in die Dateien Daten schreiben, bzw. Dateien öffnen und die Daten auslesen. Directory brauchen wir um Ordner zu erstellen und Dateien zu löschen.

### Speicherorte in den jeweiligen Betriebssystemen ###
###             Für Debugging Arbeiten              ###

Windows: C:\Users\YourName\AppData\Roaming\Godot\app_userdata\YourGame\
MacOS:   /Users/YourName/Application Support/Godot/app_userdata/YourGame/
Linux:   ~/.local/share/godot/app_userdata/YourGame/

Das gute ist, dass Godot selbst, sich um die Speicherorte auf den jeweiligen Systemen kümmert und wir nichts besonderes programmieren müssen, wenn unser Spiel/Programm für verschiedene Systeme compiliert (exportiert) werden soll.

Wir sprechen den Speicherort mit „user://“ an und landen damit in „../app_userdata/YourGame/* <–„


Code

Wichtig zu wissen ist, dass, wenn wir eine neue Datei erstellen, muss der Pfad zu ihr vorhanden sein! Als Beispiel nehmen wir an, dass wir eine „settings.ini“ Datei im Ordner „user“ erstellen wollen. Dieser Ordner existiert nicht von Anfang an und wird auch nicht automatisch erstellt. Daraus folgt, dass wir überprüfen müssen ob der Pfad zur Datei existiert und gegebenen Falls erstellen. Erst dann kann man die Datei öffnen/erstellen. Das Problem ist, der Debugger gibt uns keinen Fehler, wenn wir eine Datei, in einem nicht existenten Ordner erstellen wollen!

# Überprüfung/Erstellung eines Ordners
# Instanzierung der Directory-Bibliothek, damit wir
# mit "dir" Ordner-Befehle ausführen können
var dir = Directory.new()

# Ordner Überprüfung/Erstellung
func check_dir(dir_path: String):

   # Überprüfung ob der Ordner vorhanden ist
   if dir.dir_exists(dir_path) == false:
      
      # Ordner NICHT vorhanden --> Ordner erstellen
      dir.make_dir_recursive(dir_path)

Man kann anstatt „make_dir_recursive“ auch nur „make_dir“ verwenden, nur bedeutet „recursive“, dass wenn mehr als ein Ordner im Pfad angegeben werden, alle beide erstellt werden

dir.make_dir("user://user/profil_1/")
--> Kein Ordner wird erstellt!

dir.make_dir_recursive("user://user/profil_1/")
--> Zuerst wird "user://user/" und dann "user://user/profil_1/" erstellt!

Nach der Ordner Überprüfung können wir nun eine Datei erstellen um in dieser Inhalt abzuspeichern

# Erstellung einer Datei mit Inhalt
# Instanzierung der File-Bibliothek, damit wir
# mit "file" Ordner-Befehle ausführen können
var file = File.new()

func write_file(dir_path: String, file_name: String, data):

   # Wir greifen auf unsere vorherige Funktion zurück,
   # um zu überprüfen, ob der Ordner existiert und
   # gegebenen Falls einen zu erstellen
   check_dir(dir_path)

   # Erstellen/Schreiben einer Datei
   # file.open(dir_path + file_name, File.WRITE) erstellt eine Datei,
   # wenn diese nicht vorhanden ist, oder öffnet diese, um
   # in diese neuen Inhalt zu schreiben
   file.open(dir_path + file_name, File.WRITE)

   # Jetzt ist die gewünschte Datei geöffnet (ggf. zuvor erstellt)
   # und wir können Inhalt in dieser abspeichern
   file.store_var(data)

   # Jetzt muss nur noch die Datei wieder geschlossen werden, sodass
   # wir danach wieder eine neue öffnen können!
   file.close()

Die Variable File.WRITE im Befehl file.open(), sagt, dass wir Inhalt in eine Datei schreiben wollen. Zudem, sollte die Datei noch nicht vorhanden sein, wird eine leere Datei erstellt. Beim schreiben, in eine bereits vorhandene Datei, wird der vorherige Inhalt überschrieben!

Nun wollen wir eine Datei auslesen. Was wir bedenken müssen ist, dass wir davon ausgehen müssen, dass der Code funktionieren soll, mit als auch ohne vorhandene Datei. Wie bei der Überprüfung eines Ordners, kann man auch Dateien auf Existenz überprüfen und die Ausgabe beeinflussen. Im folgenden Beispiel wird angenommen, dass wenn die Datei nicht existiert ein neues Spiel gestartet wird und der Spieler 3 Leben erhält. Im Verlauf des Spiels kann der Spieler Leben aufsammeln, welche im Spielstand abgespeichert werden. Wenn der Spieler das Spiel später fortsetzt, werden die Leben aus der Datei wieder ausgelesen.

func read_file(dir_path: String, file_name: String):

   # Überprüfung ob Datei existiert
   if file_inst.file_exists(dir_path + file_name) != true:

      # Datei existiert nicht, d.h. neuer Spielstand --> 3 Leben
      return 3

   elif file_inst.file_exists(dir_path + file_name) == true:

      # Datei ist vorhanden und wir öffnen diese im READ-Modus
      file.open(dir_path + file_name, File.READ)

      # Wir erstellen uns eine Cache-Variable in die wir
      # gleichzeitig den ausgelesen Inhalt der Datei schreiben
      var output = file.get_var()

      # Nun schließen wir die Datei und geben den ausgelesene Wert zurück
      file.close()
      return output
WriteRead Data (13 Downloads)