Skip to content

Instantly share code, notes, and snippets.

@iamralch
Created November 20, 2015 09:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save iamralch/bd0ae550e82d90991994 to your computer and use it in GitHub Desktop.
Save iamralch/bd0ae550e82d90991994 to your computer and use it in GitHub Desktop.
Modification of ZipIt function to keep the directory hierarchy or not
func zipit(source, target string, keepHierarchy bool) error {
zipfile, err := os.Create(target)
if err != nil {
return err
}
defer zipfile.Close()
archive := zip.NewWriter(zipfile)
defer archive.Close()
info, err := os.Stat(source)
if err != nil {
return nil
}
var baseDir string
if keepHierarchy && info.IsDir() {
baseDir = filepath.Base(source)
}
filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !keepHierarchy && source == path {
return nil
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
if keepHierarchy && baseDir != "" {
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
}
if info.IsDir() {
header.Name += string(os.PathSeparator)
} else {
header.Method = zip.Deflate
}
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
if info.IsDir() {
return nil
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
return err
})
return err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment