mirror of
https://github.com/coaidev/coai.git
synced 2025-05-19 04:50:14 +09:00
165 lines
3.0 KiB
Go
165 lines
3.0 KiB
Go
package utils
|
|
|
|
import (
|
|
"archive/tar"
|
|
"archive/zip"
|
|
"compress/gzip"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func GenerateCompressTask(hash string, base, path, replacer string) (string, string, error) {
|
|
base = handlePath(base)
|
|
replacer = handlePath(replacer)
|
|
|
|
CreateFolder(base)
|
|
zipPath := fmt.Sprintf("%s/%s.zip", base, hash)
|
|
gzipPath := fmt.Sprintf("%s/%s.tar.gz", base, hash)
|
|
|
|
files := Walk(path)
|
|
|
|
if err := CreateZipObject(zipPath, files, replacer); err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
if err := CreateGzipObject(gzipPath, files, replacer); err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
return zipPath, gzipPath, nil
|
|
}
|
|
|
|
func GenerateCompressTaskAsync(hash string, base, path, replacer string) (string, string) {
|
|
zipPath := fmt.Sprintf("%s/%s.zip", base, hash)
|
|
gzipPath := fmt.Sprintf("%s/%s.tar.gz", base, hash)
|
|
|
|
files := Walk(path)
|
|
|
|
go func() {
|
|
if err := CreateZipObject(zipPath, files, replacer); err != nil {
|
|
return
|
|
}
|
|
}()
|
|
|
|
go func() {
|
|
if err := CreateGzipObject(gzipPath, files, replacer); err != nil {
|
|
return
|
|
}
|
|
}()
|
|
|
|
return zipPath, gzipPath
|
|
}
|
|
|
|
func handlePath(path string) string {
|
|
return strings.Replace(path, "\\", "/", -1)
|
|
}
|
|
|
|
func CreateZipObject(output string, files []string, replacer string) error {
|
|
FileDirSafe(output)
|
|
file, err := os.Create(output)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
writer := zip.NewWriter(file)
|
|
defer writer.Close()
|
|
|
|
for _, file := range files {
|
|
err := addFileToZip(writer, file, replacer)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func addFileToZip(zipWriter *zip.Writer, path string, replacer string) error {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
info, err := file.Stat()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
header, err := zip.FileInfoHeader(info)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
header.Name = strings.Trim(strings.Replace(path, replacer, "", 1), "/")
|
|
writer, err := zipWriter.CreateHeader(header)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = io.Copy(writer, file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func CreateGzipObject(output string, files []string, replacer string) error {
|
|
FileDirSafe(output)
|
|
tarFile, err := os.Create(output)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer tarFile.Close()
|
|
|
|
gzWriter := gzip.NewWriter(tarFile)
|
|
defer gzWriter.Close()
|
|
|
|
tarWriter := tar.NewWriter(gzWriter)
|
|
defer tarWriter.Close()
|
|
|
|
for _, file := range files {
|
|
err := addFileToTar(tarWriter, file, replacer)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// tar gzip
|
|
func addFileToTar(tarWriter *tar.Writer, filePath string, replacer string) error {
|
|
file, err := os.Open(filePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
info, err := file.Stat()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
header, err := tar.FileInfoHeader(info, "")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
header.Name = strings.Trim(strings.Replace(filePath, replacer, "", 1), "/")
|
|
|
|
err = tarWriter.WriteHeader(header)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = io.Copy(tarWriter, file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|