1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-17 19:22:28 +08:00

fix: fix bug of Zip

This commit is contained in:
dudaodong
2023-08-02 20:17:55 +08:00
parent e924429d6e
commit c3e28a9fc0

View File

@@ -197,56 +197,60 @@ func IsZipFile(filepath string) bool {
return bytes.Equal(buf, []byte("PK\x03\x04")) return bytes.Equal(buf, []byte("PK\x03\x04"))
} }
// Zip create zip file, fpath could be a single file or a directory. // Zip create zip file, fpath should be a directory.
// Play: https://go.dev/play/p/j-3sWBp8ik_P // Play: https://go.dev/play/p/j-3sWBp8ik_P
func Zip(fpath string, destPath string) error { func Zip(fpath string, destPath string) error {
zipFile, err := os.Create(destPath) outFile, err := os.Create(destPath)
if err != nil { if err != nil {
return err return err
} }
defer zipFile.Close() defer outFile.Close()
archive := zip.NewWriter(zipFile) w := zip.NewWriter(outFile)
defer archive.Close()
return addFileToArchive(fpath, archive) err = addFileToArchive(w, fpath, "")
}
func addFileToArchive(fpath string, archive *zip.Writer) error {
err := filepath.Walk(fpath, func(path string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err
} }
header, err := zip.FileInfoHeader(info) err = w.Close()
if err != nil { if err != nil {
return err return err
} }
header.Name = strings.TrimPrefix(path, filepath.Dir(fpath)+"/")
if info.IsDir() {
header.Name += "/"
} else {
header.Method = zip.Deflate
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
if _, err := io.Copy(writer, file); err != nil {
return err
}
}
return nil return nil
}) }
func addFileToArchive(w *zip.Writer, basePath, baseInZip string) error {
files, err := os.ReadDir(basePath)
if err != nil {
return err return err
} }
for _, file := range files {
if !file.IsDir() {
dat, err := os.ReadFile(basePath + file.Name())
if err != nil {
return err
}
f, err := w.Create(baseInZip + file.Name())
if err != nil {
return err
}
_, err = f.Write(dat)
if err != nil {
return err
}
} else if file.IsDir() {
newBase := basePath + file.Name() + "/"
addFiles(w, newBase, baseInZip+file.Name()+"/")
}
}
return nil
}
// UnZip unzip the file and save it to destPath. // UnZip unzip the file and save it to destPath.
// Play: https://go.dev/play/p/g0w34kS7B8m // Play: https://go.dev/play/p/g0w34kS7B8m
func UnZip(zipFile string, destPath string) error { func UnZip(zipFile string, destPath string) error {