Kiste
DE

The book is currently only available in German.

Standard-Bibliothek — `pfad`

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

Pfade aus Teilen zusammenbauen, in Komponenten zerlegen, normalisieren — portabel zwischen Windows und Unix. Reine String-Berechnungen ohne Filesystem-Zugriffe.

23.1 Aktivieren und OS-Trennzeichen

nutze pfad

sag pfad.trenner          // "\" auf Windows, "/" auf Unix
sag pfad.listen_trenner   // ";" auf Windows, ":" auf Unix (PATH-Variable)

23.2 Pfade bauen — pfad.verbunden

sag pfad.verbunden("home", "sascha", "datei.txt")
// auf Linux:   "home/sascha/datei.txt"
// auf Windows: "home\sascha\datei.txt"

sag pfad.verbunden("/foo/", "/bar")       // doppelter Trenner weg
// "/foo/bar"

Variadisch, mindestens 1 Argument. Leere Teile werden ignoriert. Doppelte Trennzeichen werden zusammengefasst.

23.3 Pfade zerlegen

Hinweis: Die folgenden Beispiel-Ausgaben sind in Unix-Schreibweise (/). Auf Windows verwendet pfad den Backslash \ — z.B. liefert pfad.verbunden("a", "b") dort a\b. Die Funktionen passen sich automatisch ans Betriebssystem an (§23.1).

nimm p = "/home/sascha/datei.tar.gz"

sag pfad.dateiname(p)      // "datei.tar.gz"
sag pfad.ordner(p)         // "/home/sascha"
sag pfad.erweiterung(p)    // ".gz"          ← nur letzte Erweiterung
sag pfad.basisname(p)      // "datei.tar"    ← Dateiname ohne letzte Erweiterung
sag pfad.zerlegt(p)        // ["home", "sascha", "datei.tar.gz"]

Hidden-Files-Caveat: pfad.erweiterung(".gitignore")".gitignore" (Standard-Verhalten wie Python's os.path.splitext und Go's filepath.Ext). Wenn dich das stört, prüfe den Dateinamen selbst mit text.beginnt_mit(name, ".").

23.4 Pfade normalisieren

sag pfad.normalisiert("foo/./bar")            // "foo/bar"
sag pfad.normalisiert("foo//bar")             // "foo/bar"
sag pfad.normalisiert("foo/bar/..")           // "foo"
sag pfad.normalisiert("foo/bar/../baz")       // "foo/baz"
sag pfad.normalisiert("")                     // "."

normalisiert macht keine Filesystem-Zugriffe.. wird rein syntaktisch aufgelöst. Wenn foo ein Symlink ist, folgt es dem nicht. Symlink-Auflösung kommt später, falls Bedarf.

23.5 Absolut und Relativ

nimm rel = "./datei.txt"
sag pfad.absolut(rel)
// auf Linux:   "/home/sascha/projekt/datei.txt"  (basierend auf CWD)
// auf Windows: "C:\Users\sascha\projekt\datei.txt"

sag pfad.ist_absolut(rel)                   // falsch
sag pfad.ist_relativ(rel)                   // wahr

sag pfad.relativ("/a/b", "/a/b/c/d")        // "c/d"
sag pfad.relativ("/a/b", "/a/c")            // "../c"
sag pfad.relativ("/a", "/a")                // "."

23.6 Pfad + Datei kombinieren — das Standard-Pattern

nutze pfad
nutze datei

nimm projekt = "meine_app"
nimm config_pfad = pfad.verbunden(projekt, "config", "settings.json")

// Sicherstellen, dass das Verzeichnis existiert
datei.erstelle_ordner_rekursiv(pfad.ordner(config_pfad))

// Schreiben
datei.schreibe(config_pfad, "\{\}")

Warum pfad separat von datei? Trennung der Aufgaben: pfad ist reine String-Manipulation (testbar, deterministisch, OS-aware). datei macht echte IO. Wer einen Pfad nur bauen oder prüfen will, ohne Filesystem-Zugriff, nutzt pfad.

23.7 Was nicht in pfad ist

  • Glob/Wildcard-Matching (*.txt-Suche) — kommt später.
  • ~-Expansion (Home-Verzeichnis) — Shell-spezifisch; kommt mit umgebung.home().
  • Symlink-Auflösung — selten gebraucht; kommt später falls Bedarf.
  • URL-Pfade — kommt mit netz-Modul.