Arbeiten mit dem Dateisystem in Go: in der Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit dem Dateisystem in Go: in der Praxis

\n\n

Die Arbeit mit dem Dateisystem ist eine der grundlegenden Aufgaben jeder Serveranwendung. Die Sprache Go (Golang) bietet ein leistungsstarkes und elegantes Werkzeugset zum Lesen, Schreiben, Löschen und Verwalten von Dateien und Verzeichnissen. In diesem Artikel werden wir praktische Beispiele für die Arbeit mit Dateien in Go unter Verwendung der Standardpakete os, io/ioutil (vor Go 1.16) und io durchgehen. Sie erfahren, wie Sie Daten auf der Festplatte effizient verwalten, Fehler behandeln und sauberen Code schreiben.

\n\n

1. Grundlagen: Öffnen, Lesen und Schreiben von Dateien

\n\n

Beginnen wir mit den häufigsten Operationen. Zum Öffnen einer Datei wird die Funktion os.OpenFile oder die einfacheren Wrapper os.Create und os.Open verwendet. Betrachten wir ein Beispiel zum Lesen einer gesamten Datei in den Speicher:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // Lesen der gesamten Datei (vor Go 1.16 wurde ioutil.ReadFile verwendet)\n    data, err := os.ReadFile("example.txt")\n    if err != nil {\n        fmt.Println("Fehler beim Lesen der Datei:", err)\n        return\n    }\n    fmt.Println("Dateiinhalt:")\n    fmt.Println(string(data))\n}\n
\n\n

Zum Schreiben von Daten in eine Datei verwenden Sie os.WriteFile:

\n\n
package main\n\nimport (\n    "os"\n)\n\nfunc main() {\n    content := []byte("Hallo, Go-Welt!\\nZweite Zeile.")\n    err := os.WriteFile("output.txt", content, 0644)\n    if err != nil {\n        panic(err)\n    }\n    // Die Datei output.txt wurde erstellt und enthält unseren Text\n}\n
\n\n

Wenn Sie Daten an das Ende einer Datei anhängen müssen, verwenden Sie Flags:

\n\n
file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)\nif err != nil {\n    panic(err)\n}\ndefer file.Close()\n\nif _, err := file.WriteString("Neuer Log-Eintrag\\n"); err != nil {\n    panic(err)\n}\n
\n\n

2. Arbeiten mit Verzeichnissen: Erstellen, Löschen und Durchlaufen

\n\n

Die Verwaltung von Ordnern ist eine ebenso wichtige Aufgabe. Ein neues Verzeichnis kann mit os.Mkdir (ein Ordner) oder os.MkdirAll (rekursiv, wie mkdir -p) erstellt werden:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // Einen Ordner erstellen\n    err := os.Mkdir("data", 0755)\n    if err != nil {\n        fmt.Println("Fehler beim Erstellen des Ordners:", err)\n    }\n\n    // Rekursiv eine verschachtelte Struktur erstellen\n    err = os.MkdirAll("data/subdir/logs", 0755)\n    if err != nil {\n        fmt.Println("Fehler:", err)\n    }\n}\n
\n\n

Zum Durchlaufen eines Verzeichnisses kann die Funktion os.ReadDir (Ersatz für ioutil.ReadDir) verwendet werden:

\n\n
entries, err := os.ReadDir(".")\nif err != nil {\n    panic(err)\n}\n\nfor _, entry := range entries {\n    fmt.Printf("Name: %s, Ordner: %t\\n", entry.Name(), entry.IsDir())\n}\n
\n\n

Für das rekursive Durchlaufen aller Dateien und Ordner verwenden Sie filepath.Walk aus dem Paket path/filepath:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n)\n\nfunc main() {\n    err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n        fmt.Println(path)\n        return nil\n    })\n    if err != nil {\n        fmt.Println("Fehler beim Durchlaufen:", err)\n    }\n}\n
\n\n

Das Löschen von Dateien und Ordnern erfolgt mit den Funktionen os.Remove und os.RemoveAll:

\n\n
// Eine einzelne Datei oder einen leeren Ordner löschen\nos.Remove("temp.txt")\n\n// Einen Ordner mit gesamten Inhalt löschen (Analog zu rm -rf)\nos.RemoveAll("data")\n
\n\n

3. Fortgeschrittene Techniken: Gepufferte Ein-/Ausgabe und Arbeiten mit temporären Dateien

\n\n

Für große Dateien ist es ineffizient, den gesamten Inhalt in den Speicher zu lesen. Verwenden Sie gepuffertes Lesen mit bufio:

\n\n
package main\n\nimport (\n    "bufio"\n    "                

Blogs

Buchempfehlungen