118 lines
2.2 KiB
Go
118 lines
2.2 KiB
Go
|
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
|
|||
|
}
|