Trabalhando com ZIP/arquivos em Go (Golang) — guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com ZIP/arquivos em Go (Golang)



Em Go (Golang), o trabalho com arquivos ZIP é implementado através do pacote padrão archive/zip. Este pacote fornece todas as ferramentas necessárias para criar, ler, escrever e extrair arquivos de arquivos ZIP. Ao contrário de muitas outras linguagens, o Go não requer a instalação de bibliotecas de terceiros para operações básicas — tudo já está na biblioteca padrão.



O pacote archive/zip suporta:

  • Criação de novos arquivos ZIP
  • Leitura de arquivos existentes
  • Adição de arquivos e diretórios
  • Extração de arquivos individuais ou de todo o arquivo
  • Trabalho com metadados de arquivos (data, permissões de acesso)


Criando um arquivo ZIP em Go



Para criar um arquivo, é necessário abrir um arquivo para escrita e criar um zip.Writer. Cada arquivo é adicionado através de Create ou CreateHeader para configuração detalhada.



package main

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

func main() { // Criando um novo arquivo ZIP zipFile, err := os.Create("example.zip") if err != nil { panic(err) } defer zipFile.Close()

// Criando um Writer para o arquivo zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close()

// Adicionando um arquivo de texto file1, err := zipWriter.Create("hello.txt") if err != nil { panic(err) } _, err = file1.Write([]byte("Hello, Go ZIP!")) if err != nil { panic(err) }

// Adicionando um segundo arquivo com conteúdo de um arquivo existente 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("Arquivo criado: example.zip")}


Lendo um arquivo ZIP



Para ler um arquivo, utiliza-se zip.OpenReader, que retorna um ReadCloser. Cada arquivo é representado pela estrutura zip.File.



package main

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

func main() { // Abrindo o arquivo para leitura reader, err := zip.OpenReader("example.zip") if err != nil { panic(err) } defer reader.Close()

// Percorrendo todos os arquivos no arquivo ZIP for _, file := range reader.File { fmt.Printf("Arquivo: %s", file.Name) fmt.Printf("Tamanho: %d bytes", file.UncompressedSize64) fmt.Printf("Tamanho compactado: %d bytes", file.CompressedSize64) fmt.Printf("Data de modificação: %s", file.Modified.Format("2006-01-02 15:04:05")) fmt.Println("---")

// Abrindo o arquivo do ZIP rc, err := file.Open() if err != nil { panic(err) } defer rc.Close()

// Lendo o conteúdo (se for um arquivo pequeno) content, err := io.ReadAll(rc) if err != nil { panic(err) } fmt.Printf("Conteúdo: %s

", string(content)) }}


Extraindo arquivos de um arquivo ZIP



Para descompactar completamente um arquivo em um diretório, é necessário criar as pastas de destino e escrever o conteúdo de cada arquivo.



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 { // Nome de arquivo seguro (prevenção de path traversal) filePath := filepath.Join(dest, file.Name) // Verificação de saída do diretório de destino if !strings.HasPrefix(filepath.Clean(filePath),

Recommendations