pcm-ai4m/utils/zip.go

115 lines
2.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package utils
import (
"archive/zip"
"io"
"os"
"path/filepath"
)
func unzip(src string, dest string) error {
r, err := zip.OpenReader(src)
if err != nil {
return err
}
defer r.Close()
os.MkdirAll(dest, 0755)
for _, f := range r.File {
filePath := filepath.Join(dest, f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
continue
}
if err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
return err
}
outFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
fileInArchive, err := f.Open()
if err != nil {
return err
}
defer fileInArchive.Close()
_, err = io.Copy(outFile, fileInArchive)
outFile.Close()
if err != nil {
return err
}
}
return nil
}
func zipFolder(sourceFolder, zipFileName string) error {
// 创建一个新的zip文件
zipFile, err := os.Create(zipFileName)
if err != nil {
return err
}
defer zipFile.Close()
// 创建一个新的zip.Writer用于写入zip文件
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// 遍历文件夹
return filepath.Walk(sourceFolder, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// 跳过源文件夹本身
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
// 修正文件路径,使其相对于源文件夹
header.Name, err = filepath.Rel(sourceFolder, path)
if err != nil {
return err
}
// 如果路径是空的(即源文件夹),则跳过
if header.Name == "." {
return nil
}
// 如果文件是目录,则设置文件类型为目录
if info.IsDir() {
header.Name += "/"
} else {
// 设置文件的修改时间和访问权限
header.Method = zip.Deflate
}
// 写入文件头到zip文件
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
// 如果是文件则打开文件并写入到zip文件中
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
return err
}
return nil
})
}