62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
|
package util
|
||
|
|
||
|
import (
|
||
|
"archive/zip"
|
||
|
"io"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
// ZipFiles compresses one or many files into a single zip archive file.
|
||
|
// Param 1: filename is the output zip file's name.
|
||
|
// Param 2: files is a list of files to add to the zip.
|
||
|
func ZipFiles(filename string, files []string) error {
|
||
|
newZipFile, err := os.Create(filename)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer newZipFile.Close()
|
||
|
|
||
|
zipWriter := zip.NewWriter(newZipFile)
|
||
|
defer zipWriter.Close()
|
||
|
|
||
|
// Add files to zip
|
||
|
for _, file := range files {
|
||
|
if err = AddFileToZip(zipWriter, file); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func AddFileToZip(zipWriter *zip.Writer, filename string) error {
|
||
|
|
||
|
fileToZip, err := os.Open(filename)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer fileToZip.Close()
|
||
|
|
||
|
// Get the file information
|
||
|
info, err := fileToZip.Stat()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
header, err := zip.FileInfoHeader(info)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Change to deflate to gain better compression
|
||
|
// see http://golang.org/pkg/archive/zip/#pkg-constants
|
||
|
header.Method = zip.Deflate
|
||
|
|
||
|
writer, err := zipWriter.CreateHeader(header)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
_, err = io.Copy(writer, fileToZip)
|
||
|
return err
|
||
|
}
|