115 lines
2.1 KiB
Go
115 lines
2.1 KiB
Go
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
|
||
})
|
||
}
|