123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- package utils
- import (
- "archive/zip"
- "fmt"
- "io"
- "io/fs"
- "log"
- "os"
- "path"
- "path/filepath"
- "strings"
- )
- func Zip(zipPath string, paths ...string) error {
-
- if err := os.MkdirAll(filepath.Dir(zipPath), os.ModePerm); err != nil {
- return err
- }
- archive, err := os.Create(zipPath)
- if err != nil {
- return err
- }
- defer archive.Close()
-
- zipWriter := zip.NewWriter(archive)
- defer zipWriter.Close()
-
- for _, rootPath := range paths {
-
- rootPath = strings.TrimSuffix(rootPath, string(os.PathSeparator))
-
- err = filepath.Walk(rootPath, walkFunc(rootPath, zipWriter))
- if err != nil {
- return err
- }
- }
- return nil
- }
- func walkFunc(rootPath string, zipWriter *zip.Writer) filepath.WalkFunc {
- return func(path string, info fs.FileInfo, err error) error {
- if err != nil {
- return err
- }
-
- if info.Mode()&os.ModeSymlink != 0 {
- return nil
- }
-
- header, err := zip.FileInfoHeader(info)
- if err != nil {
- return err
- }
-
- header.Method = zip.Deflate
-
- header.Name, err = filepath.Rel(rootPath, path)
- if err != nil {
- return err
- }
- if info.IsDir() {
- header.Name += string(os.PathSeparator)
- }
-
- headerWriter, err := zipWriter.CreateHeader(header)
- if err != nil {
- return err
- }
- if info.IsDir() {
- return nil
- }
- fmt.Println(header.Name)
- f, err := os.Open(path)
- if err != nil {
- return err
- }
- defer f.Close()
- _, err = io.Copy(headerWriter, f)
- return err
- }
- }
- func Unzip(zipPath, dstDir string, cb func(per1000 int)) error {
-
- reader, err := zip.OpenReader(zipPath)
- if err != nil {
- return err
- }
- defer reader.Close()
- total := len(reader.File)
- for index, file := range reader.File {
- per1000 := int(float32(index+1) / float32(total) * 1000)
-
- log.Println("unzip=>", file.Name)
- if cb != nil {
- cb(per1000)
- }
- if err := unzipFile(file, dstDir); err != nil {
- return err
- }
- }
- return nil
- }
- func unzipFile(file *zip.File, dstDir string) error {
-
- filePath := path.Join(dstDir, file.Name)
- if file.FileInfo().IsDir() {
- if err := os.MkdirAll(filePath, os.ModePerm); err != nil {
- return err
- }
- return nil
- }
- if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
- return err
- }
-
- rc, err := file.Open()
- if err != nil {
- return err
- }
- defer rc.Close()
-
- w, err := os.Create(filePath)
- if err != nil {
- return err
- }
- defer w.Close()
-
- _, err = io.Copy(w, rc)
- return err
- }
|