Golang mette a disposizione i package tar e zip per gestire le operazioni comuni di creazione archivi e la loro compressione. Il package tar consente di raggruppare in un unico file tutti i file contenuti in una directory mentre il package zip consente di effettuare la compressione dei dati.
Vediamo come creare un tar e un file zip. In particolare consideriamo una cartella e mettiamo il contenuto della cartella in un file tar e in un file zip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package main import ( "archive/tar" "archive/zip" "fmt" "io/ioutil" "os" ) func main() { fmt.Println("Start") filetar, err := os.Create("../mytar.tar") filezip, err := os.Create("../mytar.zip") if err != nil { fmt.Println("Errore: ", err) } writerTar := tar.NewWriter(filetar) writerZip := zip.NewWriter(filezip) defer writerTar.Close() defer writerZip.Close() files, err := ioutil.ReadDir(".") for _, singlefile := range files { if !singlefile.IsDir() { content, _ := ioutil.ReadFile(singlefile.Name()) hdr := &tar.Header{ Name: singlefile.Name(), Size: singlefile.Size(), } err = writerTar.WriteHeader(hdr) writerTar.Write(content) wr, _ := writerZip.Create(singlefile.Name()) wr.Write(content) } } fmt.Println("End") } |
Tramite la fucntion Create creo sia il file tar che il file zip e per ognuno di essi genero un writer. Tramite il comando defer mi assicuro che la chiusura del writer venga effettuato alla fine di tutti i miei comandi.
Tramite la funcion readDir recupero tutti i file della directory corrente, genero l’header per il tar che inizializzo con il nome e la size del file che sto provessando e finalmente posso scrivere tramite il writer sia l’header che il contenuto del file.
Per lo zip il giro è ancora più semplice perchè non è obbligatorio il passaggio dell’header.
Nel prossimo articolo vedremo come leggere e recuperare i dati dai miei archivi.