golang中archive/zip包

简介: golang使用archive/zip包、golang进行zip操作

一、ZIP的操作
压缩、解压

二、GO中压缩操作
1、创建zip文件
2、向这个zip文件里写入要压缩的文件的头部信息和文件信息

package main

import (
    "os"
    "log"
    "archive/zip"
    "io"
    "fmt"
)

func main() {
    err := Zip("demo.zip", []string{})
    if err != nil {
        fmt.Println(err)
    }
}

func Zip(zipFile string, fileList []string) error {
    // 创建 zip 包文件
    fw, err := os.Create(zipFile)
    if err != nil {
        log.Fatal()
    }
    defer fw.Close()

    // 实例化新的 zip.Writer
    zw := zip.NewWriter(fw)
    defer func() {
        // 检测一下是否成功关闭
        if err := zw.Close(); err != nil {
            log.Fatalln(err)
        }
    }()

    for _, fileName := range fileList {
        fr, err := os.Open(fileName)
        if err != nil {
            return err
        }
        fi, err := fr.Stat()
        if err != nil {
            return err
        }
        // 写入文件的头信息
        fh, err := zip.FileInfoHeader(fi)
        w, err := zw.CreateHeader(fh)
        if err != nil {
            return err
        }
        // 写入文件内容
        _, err = io.Copy(w, fr)
        if err != nil {
            return err
        }
    }
    return nil
}

三、GO中解缩操作
1、遍历读取zip内压缩文件信息
2、根据zip内压缩文件的数据创建文件,并写入对应数据

package main

import (
    "archive/zip"
    "os"
    "io"
    "fmt"
)

func main() {
    err := Unzip("demo.zip")
    if err != nil {
        fmt.Println(err)
    }
}

func Unzip(zipFile string) error {
    zr, err := zip.OpenReader(zipFile)
    defer zr.Close()
    if err != nil {
        return err
    }

    for _, file := range zr.File {
        // 如果是目录,则创建目录
        if file.FileInfo().IsDir() {
            if err = os.MkdirAll(file.Name, file.Mode());err != nil {
                return err
            }
            continue
        }
        // 获取到 Reader
        fr, err := file.Open()
        if err != nil {
            return err
        }

        fw, err := os.OpenFile(file.Name, os.O_CREATE|os.O_RDWR|os.O_TRUNC, file.Mode())
        if err != nil {
            return err
        }
        _, err = io.Copy(fw, fr)
        if err != nil {
            return err
        }
        fw.Close()
        fr.Close()
    }
    return nil
}

参考链接:https://broqiang.com/posts/46#top

目录
相关文章
|
18天前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
163 87
Golang的math包常用方法
|
16天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
19 3
|
16天前
|
Go
Golang语言基于GOPATH方式管理包(package)
这篇文章详细介绍了Golang语言中基于GOPATH方式管理包(package)的方法,包括包的概述、定义、引入格式、别名使用、匿名引入,以及如何快速入门自定义包,并通过具体代码案例展示了包的环境准备、代码编写、细节说明和程序运行。
28 3
|
17天前
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
16 3
|
1月前
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
15 3
|
20天前
|
Go 开发者
|
20天前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
31 0
|
3月前
|
SQL NoSQL Go
技术经验分享:Golang标准库:errors包应用
技术经验分享:Golang标准库:errors包应用
29 0
|
4月前
|
XML JSON Go
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
【4月更文挑战第26天】Go语言的`encoding/xml`库提供XML处理,包括序列化和反序列化。本文讨论了XML处理的基础,如`xml.Marshal`和`xml.Unmarshal`函数,以及常见问题和易错点,如标签命名、结构体嵌套、omitempty标签和命名空间。建议遵循标签命名规则,正确处理嵌套和属性,谨慎使用omitempty,以及理解并有效利用命名空间。文中还给出了基础示例和处理XML属性的代码示例,帮助读者掌握XML处理技巧。
87 1
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
|
3月前
|
移动开发 Go
golang bufio包怎么用?
`bufio` 是 Go 语言中用于提高 I/O 性能的包,它通过使用缓冲区减少对低效磁盘 I/O 操作的调用。简而言之,`bufio` 提供带缓冲的读写功能,减少读取或写入文件时的系统调用次数,从而提升程序性能。