golang创建zip压缩文件

golang基础包 archive/zip 提供了操作zip的能力。

步骤如下:

  1. 使用 os.Create 创建一个空的文件 file,如果存在则会被清空。
  2. 使用 zip.NewWriter(file) 得到 *zip.Writer,使用它即可操作zip文件。

示例,批量下载网络图片,保存到zip文件中,包含目录。

func TestZip(t *testing.T) {
	file, err := os.Create("test.zip")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	zipwriter := zip.NewWriter(file)
	defer zipwriter.Close()

	fs := []struct{
		Url, Name string
	}{
		{Url:"http://videoactivity.bookan.com.cn/photo_10_202011301057385583397829_t.jpg", Name:"/1/11/1.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011292229184376672977_t.jpg", Name:"2.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011292229229158424627_t.jpg", Name:"3.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011292215023830368256_t.jpg", Name:"4.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011291755419090055749_t.jpg", Name:"5.jpg"},
		{Url:"http://videoactivity.bookan.com.cn/photo_46_202011291755420502426479_t.jpg", Name:"6.jpg"},
	}

	for _, f := range fs {
		iowriter, err := zipwriter.Create(f.Name)
		if err != nil {
			if os.IsPermission(err) {
				fmt.Println("权限不足: ", err)
				return
			}
			fmt.Printf("Create file %s error: %s\n", f.Name, err.Error())
			return
		}

		var content []byte
		resp, err := http.Get(f.Url)
		if err == nil {
			content, err = ioutil.ReadAll(resp.Body)
			if err != nil {
				content = []byte("")
			}
			resp.Body.Close()
		}

		iowriter.Write(content)
	}

	// 创建空目录
	zipwriter.Create("/name/dir/")
}

几点说明:

  1. zipwriter.Create("/1/11/1.jpg") 添加一个文件到zip file中,如果包含目录,则目录也会被自动创建。文件路径必须是相对路径,不能以盘符(e.g. C:)开头,而且分隔符要使用斜线(/)而不能使用反斜线(\),如果只想创建目录而不是文件,可以使用斜线结尾(/name/dir/)。此 Create 方法返回 Writer ,通过这个 Writer 可以将内容写入文件。
  2. 文件的内容必须在下一次调用 CreateHeader、Create 或 Close 方法之前全部写入。
Golang中,可以使用`archive/zip`包来进行zip压缩。下面是一个简单的示例代码,演示如何使用该包进行文件或目录的压缩: ```go package main import ( "archive/zip" "fmt" "io" "os" "path/filepath" ) func main() { // 要压缩的文件或目录路径 source := "/path/to/source" // 压缩后的zip文件路径 destination := "/path/to/destination.zip" err := zipFiles(destination, source) if err != nil { fmt.Println(err) } else { fmt.Println("压缩完成!") } } func zipFiles(destination string, source string) error { // 创建一个新的zip文件 zipFile, err := os.Create(destination) if err != nil { return err } defer zipFile.Close() // 创建zip.Writer,用于向zip文件中写入数据 archive := zip.NewWriter(zipFile) defer archive.Close() // 递归遍历源路径下的所有文件和目录 filepath.Walk(source, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // 获取源路径下的相对路径,用于在zip文件中创建相应的目录结构 relativePath, err := filepath.Rel(source, path) if err != nil { return err } // 创建一个新的文件或目录头部 header, err := zip.FileInfoHeader(info) if err != nil { return err } // 设置头部的名称为相对路径 header.Name = relativePath if info.IsDir() { // 如果是目录,则写入一个目录头部到zip文件中 header.Name += "/" header.Method = zip.Store } else { // 如果是文件,则写入文件内容到zip文件中 header.Method = zip.Deflate } // 创建一个新的文件或目录条目,写入zip.Writer中 writer, err := archive.CreateHeader(header) if err != nil { return err } if !info.IsDir() { // 如果是文件,则打开源文件并将内容复制到zip文件中 file, err := os.Open(path) if err != nil { return err } defer file.Close() _, err = io.Copy(writer, file) if err != nil { return err } } return nil }) return nil } ``` 你可以将`source`和`destination`变量替换为你希望的路径,然后运行代码即可实现压缩。请确保你拥有对源文件或目录的读取权限,并且目标路径是一个有效的zip文件路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值