|
@@ -4,128 +4,143 @@ import (
|
|
|
"archive/zip"
|
|
|
"fmt"
|
|
|
"io"
|
|
|
+ "io/fs"
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
+ "strings"
|
|
|
)
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-func Zip(zip_file_name string, src_dir string) {
|
|
|
-
|
|
|
-
|
|
|
- os.RemoveAll(zip_file_name)
|
|
|
-
|
|
|
-
|
|
|
- zipfile, _ := os.Create(zip_file_name)
|
|
|
- defer zipfile.Close()
|
|
|
-
|
|
|
-
|
|
|
- archive := zip.NewWriter(zipfile)
|
|
|
+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()
|
|
|
|
|
|
-
|
|
|
- filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {
|
|
|
+
|
|
|
+ zipWriter := zip.NewWriter(archive)
|
|
|
+ defer zipWriter.Close()
|
|
|
|
|
|
-
|
|
|
- if path == src_dir {
|
|
|
+
|
|
|
+ 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, _ := zip.FileInfoHeader(info)
|
|
|
-
|
|
|
+
|
|
|
+ header, err := zip.FileInfoHeader(info)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ header.Method = zip.Deflate
|
|
|
+
|
|
|
+
|
|
|
+ header.Name, err = filepath.Rel(filepath.Dir(rootPath), path)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if info.IsDir() {
|
|
|
+
|
|
|
+ header.Name += "\\"
|
|
|
+ fmt.Println(header.Name)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ headerWriter, err := zipWriter.CreateHeader(header)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if info.IsDir() {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
fmt.Println(path)
|
|
|
- header.Name, _ = filepath.Rel(src_dir, path)
|
|
|
+ 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 += `/`
|
|
|
+ header.Name += "\\"
|
|
|
} else {
|
|
|
-
|
|
|
header.Method = zip.Deflate
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- writer, _ := archive.CreateHeader(header)
|
|
|
- if !info.IsDir() {
|
|
|
- file, _ := os.Open(path)
|
|
|
- defer file.Close()
|
|
|
- io.Copy(writer, file)
|
|
|
+
|
|
|
+ writer, err := writer.CreateHeader(header)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
- return nil
|
|
|
+
|
|
|
+
|
|
|
+ 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
|
|
|
}
|