123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- package utils
- import (
- "archive/zip"
- "fmt"
- "io"
- "io/fs"
- "os"
- "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 ZipFile(srcFile, destFile string) error {
-
- zipFile, err := os.Create(destFile)
- if err != nil {
- return err
- }
- defer zipFile.Close()
-
- writer := zip.NewWriter(zipFile)
- defer writer.Close()
-
- err = filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
-
- if err != nil {
- return err
- }
-
- header, err := zip.FileInfoHeader(info)
- if err != nil {
- return err
- }
- header.Name = path
- if info.IsDir() {
- header.Name += "\\"
- } else {
- header.Method = zip.Deflate
- }
-
- writer, err := writer.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
- }
|