Travailler avec les archives ZIP en Go (Golang) — guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec les archives ZIP en Go (Golang)



En Go (Golang), la manipulation des archives ZIP est implémentée via le package standard archive/zip. Ce package fournit tous les outils nécessaires pour créer, lire, écrire et extraire des fichiers d'archives ZIP. Contrairement à de nombreux autres langages, Go ne nécessite pas l'installation de bibliothèques tierces pour les opérations de base — tout est déjà présent dans la bibliothèque standard.



Le package archive/zip prend en charge :

  • La création de nouvelles archives ZIP
  • La lecture d'archives existantes
  • L'ajout de fichiers et de répertoires
  • L'extraction de fichiers individuels ou de l'archive entière
  • La manipulation des métadonnées des fichiers (date, droits d'accès)


Création d'une archive ZIP en Go



Pour créer une archive, il faut ouvrir un fichier en écriture et créer un zip.Writer. Chaque fichier est ajouté via Create ou CreateHeader pour un réglage fin.



package main

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

func main() { // Création d'un nouveau fichier ZIP zipFile, err := os.Create("example.zip") if err != nil { panic(err) } defer zipFile.Close()

// Création du Writer pour l'archive zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close()

// Ajout d'un fichier texte file1, err := zipWriter.Create("hello.txt") if err != nil { panic(err) } _, err = file1.Write([]byte("Bonjour, Go ZIP !")) if err != nil { panic(err) }

// Ajout d'un deuxième fichier avec le contenu d'un fichier existant 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("Archive créée : example.zip")}


Lecture d'une archive ZIP



Pour lire une archive, on utilise zip.OpenReader qui retourne un ReadCloser. Chaque fichier est représenté par une structure zip.File.



package main

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

func main() { // Ouverture de l'archive en lecture reader, err := zip.OpenReader("example.zip") if err != nil { panic(err) } defer reader.Close()

// Parcours de tous les fichiers de l'archive for _, file := range reader.File { fmt.Printf("Fichier : %s", file.Name) fmt.Printf("Taille : %d octets", file.UncompressedSize64) fmt.Printf("Taille compressée : %d octets", file.CompressedSize64) fmt.Printf("Date de modification : %s", file.Modified.Format("2006-01-02 15:04:05")) fmt.Println("---")

// Ouverture du fichier depuis l'archive rc, err := file.Open() if err != nil { panic(err) } defer rc.Close()

// Lecture du contenu (si le fichier est petit) content, err := io.ReadAll(rc) if err != nil { panic(err) } fmt.Printf("Contenu : %s

", string(content)) }}


Extraction de fichiers depuis une archive



Pour décompresser complètement une archive dans un répertoire, il faut créer les dossiers cibles et écrire le contenu de chaque fichier.



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 { // Nom de fichier sécurisé (prévention du path traversal) filePath := filepath.Join(dest, file.Name) // Vérification de sortie du répertoire cible if !strings.HasPrefix(filepath.Clean(filePath),

Recommendations