Golang zip解压缩文件
import (
"archive/zip"
"bufio"
"fmt"
"io"
"io/fs"
"os"
"path"
"path/filepath"
"strings"
)
func main() {
dir := "C:/Users/Administrator/Desktop/111/test"
zipName := "C:/Users/Administrator/Desktop/111/test.zip"
unZipName := "C:/Users/Administrator/Desktop/111/upload.zip"
unZipFile(unZipName)
zipFile(dir, zipName)
}
//解压
func unZipFile(unZipName string) {
f1, err1 := zip.OpenReader(unZipName)
if err1 != nil {
fmt.Println("err1:", err1)
return
}
defer f1.Close()
curPath := path.Dir(unZipName)
for _, v := range f1.File {
if v.FileInfo().IsDir() {
if v.FileInfo().IsDir() {
fullPath := filepath.Join(curPath, v.Name)
err4 := os.MkdirAll(fullPath, 0777)
if err4 != nil {
fmt.Println(err4)
return
}
}
} else {
fullPathFile := filepath.Join(curPath, v.Name)
f3, err6 := v.Open()
f4, err7 := os.OpenFile(fullPathFile, os.O_CREATE|os.O_WRONLY, 0777)
if err6 != nil {
fmt.Println(err6)
return
}
if err7 != nil {
fmt.Println(err7)
return
}
defer f3.Close()
f5 := bufio.NewWriter(f4)
_, err8 := io.Copy(f5, f3)
if err8 != nil {
fmt.Println(err8)
return
}
}
}
}
//压缩
func zipFile(dir, zipName string) {
file := []string{}
topPath := path.Dir(dir) //压缩的是test目录,要去掉test前面的路径
//存在就先删除
_, err := os.Stat(zipName)
if err == nil {
os.RemoveAll(zipName)
}
//创建zip文件
z1, err1 := os.Create(zipName)
if err1 != nil {
fmt.Println("err1=", err1)
return
}
//打开zip文件
z2 := zip.NewWriter(z1)
defer z2.Close()
//遍历目录
err2 := GetPathFile(dir, &file)
if err2 != nil {
fmt.Println("err2=", err2)
return
}
//写入zip文件
for _, v := range file {
f1, _ := os.Stat(v)
header, _ := zip.FileInfoHeader(f1)
header.Name = strings.TrimPrefix(v, topPath)
if f1.IsDir() {
header.Name += `/`
}
header.Method = zip.Deflate
w2, _ := z2.CreateHeader(header)
if !f1.IsDir() {
f2, _ := os.Open(v)
defer f2.Close()
io.Copy(w2, f2)
}
}
}
func GetPathFile(old string, file *[]string) error {
d1func := func(s string, f fs.FileInfo, err error) error {
if f == nil {
return err
}
s = strings.ReplaceAll(s, "\\", "/")
if s != old {
*file = append(*file, s)
}
return nil
}
return filepath.Walk(old, d1func)
}