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 Auch in der Bibliothek
Nodemailer — E-Mail-Versand mit TypeScript
Arbeiten mit CSV in Go (Golang): Vollständige Anleitung zum Parsen und Schreiben
GraphQL-Bibliotheken für TypeScript: Vollständiger Leitfaden zur Auswahl und Verwendung
PhotosUI für Swift: Vollständige Anleitung mit Beispielen
gRPC für Swift (iOS/macOS): Bibliotheken, Einrichtung und Beispiele