mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-08 05:47:07 +09:00
89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package ziputil
|
|
|
|
import (
|
|
"archive/zip"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func ZipFolder(source, targetZip string) error {
|
|
zipFile, err := os.Create(targetZip)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer zipFile.Close()
|
|
|
|
writer := zip.NewWriter(zipFile)
|
|
defer writer.Close()
|
|
|
|
return filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
relPath, err := filepath.Rel(source, path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if relPath == "." {
|
|
return nil
|
|
}
|
|
if info.IsDir() {
|
|
_, err := writer.Create(strings.ReplaceAll(relPath, "\\", "/") + "/")
|
|
return err
|
|
}
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
zipWriter, err := writer.Create(strings.ReplaceAll(relPath, "\\", "/"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = io.Copy(zipWriter, f)
|
|
return err
|
|
})
|
|
}
|
|
|
|
func UnzipFolder(sourceZip, targetDir string) error {
|
|
r, err := zip.OpenReader(sourceZip)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer r.Close()
|
|
if err := os.MkdirAll(targetDir, 0755); err != nil {
|
|
return err
|
|
}
|
|
for _, file := range r.File {
|
|
// nolint: gosec
|
|
extractedPath := filepath.Join(targetDir, file.Name)
|
|
if file.FileInfo().IsDir() {
|
|
if err := os.MkdirAll(extractedPath, 0700); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
if err := extractFile(file, extractedPath); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func extractFile(file *zip.File, outputPath string) error {
|
|
rc, err := file.Open()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer rc.Close()
|
|
outputFile, err := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer outputFile.Close()
|
|
// nolint: gosec
|
|
_, err = io.Copy(outputFile, rc)
|
|
return err
|
|
}
|