在Go语言中,archive/zip包提供了创建、读取和解压缩ZIP格式文件的功能。
一、创建ZIP文件并添加内容----压缩
Go
package main
import (
"archive/zip"
"bytes"
"fmt"
"io"
"log"
"os"
)
func main() {
// 创建一个缓冲区来存储ZIP文件的内容
buf := new(bytes.Buffer)
// 创建一个新的ZIP文件
zipWriter := zip.NewWriter(buf)
// 添加文件到ZIP文件中
addFileToZip(zipWriter, "file1.txt", []byte("向file1写入内容"))
addFileToZip(zipWriter, "file2.txt", []byte("向file2写入内容"))
// 关闭ZIP文件
err := zipWriter.Close()
if err != nil {
log.Fatal(err)
}
// 将ZIP文件内容写入磁盘
file, err := os.Create("testFileZip.zip")
if err != nil {
log.Fatal(err)
}
defer file.Close()
_, err = io.Copy(file, buf)
if err != nil {
log.Fatal(err)
}
fmt.Println("压缩文件创建成功!")
}
// 辅助函数,用于将字节数据作为文件添加到ZIP中
func addFileToZip(zipWriter *zip.Writer, fileName string, data []byte) error {
header := &zip.FileHeader{
Name: fileName,
Method: zip.Deflate,
}
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
_, err = writer.Write(data)
return err
}
二、解压缩ZIP文件----读取并解压缩一个ZIP文件
Go
package main
import (
"archive/zip"
"fmt"
"io"
"log"
"os"
"path/filepath"
)
func main() {
//读取zip压缩文件
reader, err := zip.OpenReader("testFileZip.zip")
if err != nil {
log.Fatal(err)
}
defer reader.Close()
folder := "testFileZip"
_, err = os.Stat(folder) // os.Stat 函数来获取 folder 指定路径的状态信息。
if err != nil && os.IsNotExist(err) { //判断是否存在
err = os.Mkdir(folder, os.ModePerm) //不存在就创建,os.ModePerm是Go语言中定义的默认权限,通常用于创建文件或目录。
if err != nil {
log.Fatal(err)
}
}
//提取压缩文件
for _, file := range reader.File {
fmt.Println("提取到的文件有:", file.Name)
// 创建目标文件的路径
targetPath := filepath.Join("testFileZip", file.Name)
// 创建目标文件
outputFile, err := os.Create(targetPath)
if err != nil {
log.Fatal(err)
}
defer outputFile.Close()
// 读取并解压文件内容到目标文件
fileReader, err := file.Open()
if err != nil {
log.Fatal(err)
}
defer fileReader.Close()
_, err = io.Copy(outputFile, fileReader)
if err != nil {
log.Fatal(err)
}
}
fmt.Println("已成功提取所有文件")
}