Arbeiten mit ZIP-Archiven in Go (Golang): Erstellen, Lesen und Extrahieren von Dateien

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 ZIP-Archiven in Go (Golang): Vollständige Anleitung



In der modernen Entwicklung mit Go (Golang) ist die Arbeit mit Archiven eine häufige Aufgabe. Ob zum Verpacken von Logs, Hochladen von Dateien auf einen Server oder Erstellen von Backups – die Standardbibliothek archive/zip bietet alles, was zum Erstellen, Lesen und Ändern von ZIP-Archiven benötigt wird, ohne dass zusätzliche Abhängigkeiten installiert werden müssen. In diesem Artikel behandeln wir die grundlegenden Operationen mit ZIP in Go anhand praktischer Beispiele.



Grundlegende Funktionen des Pakets archive/zip

Das Paket archive/zip ist Teil der Go-Standardbibliothek und unterstützt:

  • Erstellen neuer ZIP-Archive mit beliebiger Ordnerstruktur
  • Lesen des Inhalts vorhandener Archive
  • Extrahieren einzelner Dateien oder des gesamten Archivs
  • Hinzufügen von Dateien zu einem vorhandenen Archiv (durch Kopieren)
  • Arbeiten mit Dateimetadaten (Datum, Zugriffsrechte, Kommentare)
  • Streaming-Verarbeitung (ohne das gesamte Archiv in den Speicher zu laden)


Erstellen eines ZIP-Archivs in Go

Zum Erstellen eines Archivs wird zip.NewWriter() verwendet, das einen io.Writer akzeptiert. Dadurch kann das Archiv sowohl in eine Datei als auch in einen Puffer (z. B. zum Senden über HTTP) geschrieben werden.



package main

import ( "archive/zip" "bytes" "fmt" "io" "log" "os")

func createZip() { // Puffer für das Archiv erstellen buf := new(bytes.Buffer) writer := zip.NewWriter(buf)

// Datei mit Text hinzufügen file1, err := writer.Create("hello.txt") if err != nil { log.Fatal(err) } _, err = file1.Write([]byte("Hallo, Welt! Dies ist eine Datei aus dem ZIP-Archiv.")) if err != nil { log.Fatal(err) }

// Datei in einem Unterordner hinzufügen file2, err := writer.Create("docs/readme.md") if err != nil { log.Fatal(err) } _, err = file2.Write([]byte("# DokumentationInhalt der readme.")) if err != nil { log.Fatal(err) }

// Writer unbedingt schließen err = writer.Close() if err != nil { log.Fatal(err) }

// Archiv in Datei speichern err = os.WriteFile("example.zip", buf.Bytes(), 0644) if err != nil { log.Fatal(err) } fmt.Println("Archiv erstellt: example.zip")}

func main() { createZip()}


Lesen und Extrahieren von Dateien aus ZIP

Zum Lesen eines Archivs wird zip.OpenReader() oder zip.NewReader() (für Daten aus dem Speicher) verwendet. Jede Datei wird durch die Struktur zip.File repräsentiert.



func readZip() {    reader, err := zip.OpenReader("example.zip")    if err != nil {        log.Fatal(err)    }    defer reader.Close()

for _, f := range reader.File { fmt.Printf("Datei: %s (Größe: %d Bytes)", f.Name, f.UncompressedSize64)

// Inhalt der Datei öffnen rc, err := f.Open() if err != nil { log.Fatal(err) }

// Inhalt lesen content, err := io.ReadAll(rc) if err != nil { log.Fatal(err) } rc.Close()

fmt.Printf("Inhalt: %s

", content) }}


Extrahieren aller Dateien auf die Festplatte

Häufig ist es erforderlich, ein Archiv in ein bestimmtes Verzeichnis zu entpacken. Dabei ist es wichtig, Unterordner korrekt zu erstellen.



func extractZip(src, dest string) {    reader, err := zip.OpenReader(src)    if err != nil {        log.Fatal(err)    }    defer reader.Close()

for _, f := range reader.File { // Pfad für die Extraktion fpath := filepath.Join(dest, f.Name)

// Prüfen, ob der Pfad nicht außerhalb von dest liegt (Sicherheit) if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) { log.Fatalf("Ungültiger Pfad: %s", fpath) }

// Ordner erstellen if f.FileInfo

Empfehlungen