Creare e scompattare file ZIP in Go
In questo articolo vediamo come creare e poi scompattare archivi ZIP in Go.
Non non necessarie librerie esterne, in quanto Go ha già tutto quello che ci serve.
Qui sotto il codice con le due funzioni; i file da mettere nell'archivio li ho inseriti in un array "statico":
package main
import (
"archive/zip"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
func main() {
CreateZip("/home/fermat/TEST/test.zip")
OpeZip("/home/fermat/TEST/test.zip", "/home/fermat/Scrivania/")
}
func CreateZip(file string) {
archive, err := os.Create(file)
if err != nil {
fmt.Println(err)
}
defer archive.Close()
writer := zip.NewWriter(archive)
fileToZip := []string{"/home/fermat/TEST/1.jpg", "/home/fermat/TEST/test.csv"}
for _, s := range fileToZip {
f, err := os.Open(s)
if err != nil {
fmt.Println(err)
}
defer f.Close()
w, err := writer.Create(f.Name())
if err != nil {
fmt.Println(err)
}
if _, err := io.Copy(w, f); err != nil {
fmt.Println(err)
}
}
writer.Close()
}
func OpeZip(file string, output string) {
archive, err := zip.OpenReader(file)
if err != nil {
fmt.Println(err)
}
defer archive.Close()
for _, f := range archive.File {
filePath := filepath.Join(output, f.Name)
if !strings.HasPrefix(filePath, filepath.Clean(output)+string(os.PathSeparator)) {
fmt.Println("Path invalido")
return
}
if f.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
fmt.Println("Path invalido")
}
dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
panic(err)
}
fileInArchive, err := f.Open()
if err != nil {
fmt.Println(err)
}
if _, err := io.Copy(dstFile, fileInArchive); err != nil {
fmt.Println(err)
}
dstFile.Close()
fileInArchive.Close()
}
}
Enjoy!
go archive zip
Commentami!