fonchain-fiee/pkg/utils/zip.go

118 lines
2.2 KiB
Go
Raw Normal View History

2025-02-19 06:24:15 +00:00
package utils
import (
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"archive/zip"
)
func CompressByFiles(fileNames []string, dest string) error {
d, _ := os.Create(dest)
defer d.Close()
w := zip.NewWriter(d)
defer w.Close()
for _, fileName := range fileNames {
file, err := os.Open(fileName)
//defer file.Close()
if err != nil {
log.Println(err)
return err
}
err = compress(file, "", w)
if err != nil {
log.Println(err)
return err
}
}
return nil
}
func compress(file *os.File, prefix string, zw *zip.Writer) error {
info, err := file.Stat()
if err != nil {
log.Println(err)
return err
}
header, err := zip.FileInfoHeader(info)
header.Name = prefix + "/" + header.Name
if err != nil {
log.Println(err)
return err
}
writer, err := zw.CreateHeader(header)
if err != nil {
log.Println(err)
return err
}
_, err = io.Copy(writer, file)
file.Close()
if err != nil {
log.Println(err)
return err
}
return nil
}
func ZipDirectory(dirPath string, zipFilePath string) error {
// 创建目标zip文件
zipFile, err := os.Create(zipFilePath)
if err != nil {
return err
}
defer zipFile.Close()
// 创建zip.Writer写入目标文件
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// 递归遍历目录将文件和子目录添加到zip.Writer中
err = filepath.Walk(dirPath, func(filePath string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// 创建zip文件中的路径
relPath := strings.TrimPrefix(filePath, dirPath)
zipPath := filepath.Join(filepath.Base(dirPath), relPath)
// 如果是目录,则只创建目录而不添加文件
if info.IsDir() {
_, err = zipWriter.Create(zipPath + "/")
if err != nil {
return err
}
} else {
// 如果是文件则创建文件并将内容写入zip.Writer中
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
zipFile, err := zipWriter.Create(zipPath)
if err != nil {
return err
}
_, err = io.Copy(zipFile, file)
if err != nil {
return err
}
}
return nil
})
if err != nil {
return err
}
fmt.Printf("目录 %s 已打包成文件 %s\n", dirPath, zipFilePath)
return nil
}