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 keinbytes-Typ in der Sprache. Kommt mitbytes-Modul.- Pfad-Manipulation (
verbinde,erweiterung,absolut) — eigenespfad-Modul. - Datei-Watching, Locks, Memory-Mapped IO — spätere Phasen.
- Working Directory —
umgebung-Modul. - Dateien aus dem Web —
netz-Modul.