archive.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package main
  2. import (
  3. "archive/zip"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. )
  8. type ZipWorker struct {
  9. zipWriter *zip.Writer
  10. root string
  11. }
  12. func NewZipWorker(zipFile io.Writer, root string) *ZipWorker {
  13. return &ZipWorker{
  14. zipWriter: zip.NewWriter(zipFile),
  15. root: root,
  16. }
  17. }
  18. func (worker *ZipWorker) run() error {
  19. defer worker.close()
  20. return filepath.Walk(worker.root, worker.zipAllFiles)
  21. }
  22. func (worker *ZipWorker) zipAllFiles(path string, info os.FileInfo, err error) error {
  23. if info.IsDir() {
  24. return nil
  25. }
  26. fileWriter, err := worker.zipWriter.Create(path)
  27. if err != nil {
  28. return err
  29. }
  30. fileReader, err := os.Open(path)
  31. if err != nil {
  32. return err
  33. }
  34. _, err = io.Copy(fileWriter, fileReader)
  35. return err
  36. }
  37. func (worker *ZipWorker) close() {
  38. worker.zipWriter.Close()
  39. }
  40. func zipFolder(folder string, file string) error {
  41. if _, err := os.Stat(file); err == nil {
  42. os.Remove(file)
  43. }
  44. zipFile, err := os.Create(file)
  45. if err != nil {
  46. return err
  47. }
  48. defer zipFile.Close()
  49. return NewZipWorker(zipFile, folder).run()
  50. }