分享
  1. 首页
  2. 文章

golang压缩和解压缩zip文件

CodingCode · · 7661 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang压缩和解压缩zip文件

一个简单例子说明如何使用golang提供的archive/zip包实现zip文件的压缩和解压缩。

压缩

提供两个参数:

  1. 一个是输入源文件
  2. 另一个是输出zip压缩文件

其中输入源文件可以是一个文件,也可以好似一个目录,如果是目录那么目录下的所有文件都会被压缩到输出。

当然这个函数很容易被扩展成支持多个输入源文件/目录的情况。

// srcFile could be a single file or a directory
func Zip(srcFile string, destZip string) error {
 zipfile, err := os.Create(destZip)
 if err != nil {
 return err
 }
 defer zipfile.Close()
 archive := zip.NewWriter(zipfile)
 defer archive.Close()
 filepath.Walk(srcFile, 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 = path
 if info.IsDir() {
 header.Name += "/"
 } else {
 header.Method = zip.Deflate
 }
 writer, err := archive.CreateHeader(header)
 if err != nil {
 return err
 }
 if ! info.IsDir() {
 file, err := os.Open(path)
 if err != nil {
 return err
 }
 defer file.Close()
 _, err = io.Copy(writer, file)
 }
 return err
 })
 return err
}

解压缩

也有提供两个参数:

  1. 一个是输入源zip文件
  2. 另一个是输出路径
func Unzip(zipFile string, destDir string) error {
 zipReader, err := zip.OpenReader(zipFile)
 if err != nil {
 return err
 }
 defer zipReader.Close()
 for _, f := range zipReader.File {
 fpath := filepath.Join(destDir, f.Name)
 if f.FileInfo().IsDir() {
 os.MkdirAll(fpath, os.ModePerm)
 } else {
 if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
 return err
 }
 inFile, err := f.Open()
 if err != nil {
 return err
 }
 defer inFile.Close()
 outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
 if err != nil {
 return err
 }
 defer outFile.Close()
 _, err = io.Copy(outFile, inFile)
 if err != nil {
 return err
 }
 }
 }
 return nil
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:CodingCode

查看原文:golang压缩和解压缩zip文件

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
7661 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏