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), Também na biblioteca
Programação Reativa em TypeScript: biblioteca RxJS
Trabalhando com S3 e armazenamentos em nuvem em TypeScript: guia completo
Migrações de banco de dados em C++: visão geral de ferramentas e bibliotecas
Trabalho com arquivos ZIP em PHP: guia completo sobre ZipArchive