archive.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. if err != nil {
  36. return err
  37. }
  38. return nil
  39. }
  40. func (worker *ZipWorker) close() {
  41. worker.zipWriter.Close()
  42. }
  43. func zipFolder(folder string, file string) error {
  44. if _, err := os.Stat(file); err == nil {
  45. os.Remove(file)
  46. }
  47. zipFile, err := os.Create(file)
  48. if err != nil {
  49. return err
  50. }
  51. defer zipFile.Close()
  52. return NewZipWorker(zipFile, folder).run()
  53. }