coai/utils/compress.go
2024-03-08 23:46:49 +08:00

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
}