在Go语言中,archive/zip包提供了创建、读取和解压缩ZIP格式文件的功能。
一、创建ZIP文件并添加内容----压缩
package mainimport ("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文件
package mainimport ("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("已成功提取所有文件")
}