Arbeiten mit ZIP/Archiven in Go (Golang) — vollständige Anleitung

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)



In Go (Golang) wird die Arbeit mit ZIP-Archiven über das Standardpaket archive/zip realisiert. Dieses Paket bietet alle notwendigen Werkzeuge zum Erstellen, Lesen, Schreiben und Extrahieren von Dateien aus ZIP-Archiven. Im Gegensatz zu vielen anderen Sprachen erfordert Go keine Installation von Drittanbieter-Bibliotheken für grundlegende Operationen – alles ist bereits in der Standardbibliothek enthalten.



Das Paket archive/zip unterstützt:

  • Erstellen neuer ZIP-Archive
  • Lesen vorhandener Archive
  • Hinzufügen von Dateien und Verzeichnissen
  • Extrahieren einzelner Dateien oder des gesamten Archivs
  • Arbeiten mit Dateimetadaten (Datum, Zugriffsrechte)


Erstellen eines ZIP-Archivs in Go



Um ein Archiv zu erstellen, muss eine Datei zum Schreiben geöffnet und ein zip.Writer erstellt werden. Jede Datei wird über Create oder CreateHeader für eine detaillierte Konfiguration hinzugefügt.



package main

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

func main() { // Neue ZIP-Datei erstellen zipFile, err := os.Create("example.zip") if err != nil { panic(err) } defer zipFile.Close()

// Writer für das Archiv erstellen zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close()

// Textdatei hinzufügen file1, err := zipWriter.Create("hello.txt") if err != nil { panic(err) } _, err = file1.Write([]byte("Hallo, Go ZIP!")) if err != nil { panic(err) }

// Zweite Datei mit Inhalt aus einer vorhandenen Datei hinzufügen sourceFile, err := os.Open("source.txt") if err != nil { panic(err) } defer sourceFile.Close()

targetFile, err := zipWriter.Create("copy_of_source.txt") if err != nil { panic(err) } _, err = io.Copy(targetFile, sourceFile) if err != nil { panic(err) }

fmt.Println("Archiv erstellt: example.zip")}


Lesen eines ZIP-Archivs



Zum Lesen eines Archivs wird zip.OpenReader verwendet, das einen ReadCloser zurückgibt. Jede Datei wird durch die Struktur zip.File repräsentiert.



package main

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

func main() { // Archiv zum Lesen öffnen reader, err := zip.OpenReader("example.zip") if err != nil { panic(err) } defer reader.Close()

// Alle Dateien im Archiv durchlaufen for _, file := range reader.File { fmt.Printf("Datei: %s", file.Name) fmt.Printf("Größe: %d Bytes", file.UncompressedSize64) fmt.Printf("Komprimierte Größe: %d Bytes", file.CompressedSize64) fmt.Printf("Änderungsdatum: %s", file.Modified.Format("2006-01-02 15:04:05")) fmt.Println("---")

// Datei aus dem Archiv öffnen rc, err := file.Open() if err != nil { panic(err) } defer rc.Close()

// Inhalt lesen (falls kleine Datei) content, err := io.ReadAll(rc) if err != nil { panic(err) } fmt.Printf("Inhalt: %s

", string(content)) }}


Extrahieren von Dateien aus dem Archiv



Für das vollständige Entpacken eines Archivs in ein Verzeichnis müssen Zielordner erstellt und der Inhalt jeder Datei geschrieben werden.



package main

import ( "archive/zip" "fmt" "io" "os" "path/filepath")

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

for _, file := range reader.File { // Sicherer Dateiname (Verhinderung von Path Traversal) filePath := filepath.Join(dest, file.Name) // Prüfung auf Verlassen des Zielverzeichnisses if !strings.HasPrefix(filepath.Clean(filePath),

Empfehlungen