Kiste
DE

The book is currently only available in German.

Standard-Bibliothek — `datei`

Verfügbar — implementiert in Phase B.6.5. Vollständige Spec in docs/datei.md.

Dateien lesen, schreiben, prüfen, Verzeichnisse anlegen und auflisten — die Standard-Operationen, die fast jedes Programm braucht.

21.1 Aktivieren und Lesen

nutze datei

// Hinweis: setzt vorhandene Dateien voraus (sonst Fehler).
nimm config = datei.inhalt("./config.json")
nimm zeilen = datei.zeilen("./readme.md")
sag "Datei hat {länge(zeilen)} Zeilen"

Konvention (E-063): Lese-Funktionen sind Substantive — sie beschreiben das Ergebnis (inhalt, zeilen), nicht die Aktion. Schreib-Funktionen sind Imperative — sie beschreiben den Befehl (schreibe, hänge_an), weil sie das Dateisystem mutieren.

21.2 Schreiben

datei.schreibe("./neu.txt", "Hallo Welt!")     // überschreibt / erstellt
datei.hänge_an("./log.txt", "Eintrag\n")       // append

Beide geben nichts zurück. Wenn die Datei nicht existiert, wird sie erstellt. Übergeordnete Verzeichnisse müssen aber existieren — sonst Fehler. Wer „lege alles automatisch an" will, ruft vorher datei.erstelle_ordner_rekursiv(...) auf.

21.3 Existenz und Typ prüfen

wenn datei.existiert("./daten.json") {
    sag "Datei oder Ordner ist da"
}
wenn datei.ist_datei("./x.txt") { /* ... */ }
wenn datei.ist_ordner("./projekt") { /* ... */ }

Wichtig: Diese drei werfen niemals einen Fehler — bei nicht-existierenden Pfaden geben sie einfach falsch. So kann man sie sicher als Vorab-Check nutzen.

21.4 Metadaten

sag "Größe: {datei.größe(\"./bild.png\")} Bytes"
sag "Geändert (Unix-Timestamp): {datei.geändert_unix(\"./bild.png\")}"

Hinweis Suffix _unix: Heute gibt es noch kein zeit-Modul; daher liefert geändert_unix einen rohen Unix-Timestamp als ganz (Sekunden seit 1970). Wenn zeit kommt, gibt's zusätzlich datei.geändert(...) mit einem Datum-Wert — der _unix-Variante bleibt für Skripte, die rohe Timestamps brauchen.

21.5 Manipulieren

datei.lösche("./alt.txt")                          // weg (Datei oder leerer Ordner)
datei.kopiere("./quelle.txt", "./ziel.txt")        // überschreibt ziel
datei.verschiebe("./alt.txt", "./neu.txt")         // = umbenennen

lösche auf eine nicht-existierende Datei wirft einen Fehler. Wer „weg, falls da" will, prüft vorher mit existiert.

lösche löscht nur leere Ordner. Für rekursives Löschen siehe §21.6.

21.6 Verzeichnisse

datei.erstelle_ordner("./neuer_ordner")             // ein Schritt
datei.erstelle_ordner_rekursiv("./a/b/c")           // alle drei Schichten
                                                    // no-op wenn schon da
// GEFÄHRLICH — löscht alles drin:
datei.lösche_ordner_rekursiv("./projekt_alt")

Expliziter Name für die rekursive Lösch-Variante — kein Standard-Verhalten. Damit man niemals „aus Versehen" einen ganzen Baum löscht.

21.7 Verzeichnis-Inhalt auflisten

nimm namen = datei.einträge("./projekt")
// → ["src", "tests", "readme.md", ...] alphabetisch sortiert

wiederhole eintrag in namen {
    sag "  • {eintrag}"
}

Wenn du auch die Größe und ob es ein Ordner ist brauchst:

wiederhole detail in datei.einträge_mit_details("./projekt") {
    nimm typ_text = "datei "
    wenn detail["ist_ordner"] {
        typ_text = "ordner"
    }
    sag "[{typ_text}] {detail[\"name\"]}  ({detail[\"größe\"]} Bytes)"
}

Jeder Eintrag ist eine karte mit Schlüsseln name, ist_ordner, größe, geändert_unix.

21.8 Pfade

datei arbeitet mit String-Pfaden, was reinkommt. Auf Windows funktionieren sowohl \ als auch /. Auf Unix nur /. Für portable Pfad-Manipulation (verbinden, Erweiterung holen, normalisieren) kommt später ein eigenes pfad-Modul.

Heute behilflich:

nimm voller_pfad = ordner + "/" + dateiname    // funktioniert auf Win+Unix

21.9 Was nicht in datei ist

  • bytes_lesen / bytes_schreiben — heute kein bytes-Typ in der Sprache. Kommt mit bytes-Modul.
  • Pfad-Manipulation (verbinde, erweiterung, absolut) — eigenes pfad-Modul.
  • Datei-Watching, Locks, Memory-Mapped IO — spätere Phasen.
  • Working Directoryumgebung-Modul.
  • Dateien aus dem Webnetz-Modul.