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), Auch in der Bibliothek
Newtonsoft.Json für C# (.NET): Vollständiger Leitfaden mit Beispielen
Redis-Client für Rust: Überblick über die Bibliothek redis-rs
GraphQL in Swift: Vollständiger Leitfaden zur Apollo iOS Bibliothek
Arbeiten mit Daten in Kotlin: Bibliotheken und Werkzeuge (Kotlinx-datetime, Joda-Time, java.time)
Logging für Kotlin: Die besten Lösungen und Bibliotheken