Golang 中的 archive/zip 包详解(一):实现 ZIP 压缩与解压

Golang 中的 archive/zip 包用于处理 ZIP 格式的压缩文件,提供了一系列用于创建、读取和解压缩 ZIP 格式文件的函数和类型,使用起来非常方便。

实现压缩功能

1、首先需要创建一个 zip 文件。

zip 文件也是一个文件,首先需要创建一个基础的 zip 文件,使用 os.Create() 函数创建即可。

package mainimport "os"func main() {//第一步,创建 zip 文件zipFile, err := os.Create("archive.zip")if err != nil {panic(err)}defer zipFile.Close()
}

2、使用 zip.NewWriter() 函数创建一个新的 *Writer 对象,用于将待压缩的文件写入到 zip 文件。

package mainimport ("archive/zip""os"
)func main() {//第一步,创建 zip 文件zipFile, err := os.Create("archive.zip")if err != nil {panic(err)}defer zipFile.Close()//第二步,创建一个新的 *Writer 对象zipWriter := zip.NewWriter(zipFile)}

3、向 zip 文件中添加第一个文件

创建完 zip writer 后,向 zip 文件中添加一个文件

package mainimport ("archive/zip""io""os"
)func main() {//第一步,创建 zip 文件zipFile, err := os.Create("archive.zip")if err != nil {panic(err)}defer zipFile.Close()//第二步,创建一个新的 *Writer 对象zipWriter := zip.NewWriter(zipFile)//第三步,向 zip 文件中添加第一个文件////向 zip 文件中添加一个文件,返回一个待压缩的文件内容应写入的 Writerw, err := zipWriter.Create("json.go")if err != nil {panic(err)}// 打开待压缩的文件f, err := os.Open("bec/json.go")if err != nil {panic(err)}defer f.Close()//需要压缩更多文件到压缩包的话,只需要重复第三步即可,只需要更换下文件名if _, err := io.Copy(w, f); err != nil {panic(err)}
}

4、关闭 zip writer,将所有数据写入指向基础 zip 文件的数据流

package mainimport ("archive/zip""io""os"
)func main() {//第一步,创建 zip 文件zipFile, err := os.Create("archive.zip")if err != nil {panic(err)}defer zipFile.Close()//第二步,创建一个新的 *Writer 对象zipWriter := zip.NewWriter(zipFile)//第三步,向 zip 文件中添加第一个文件////向 zip 文件中添加一个文件,返回一个待压缩的文件内容应写入的 Writerw, err := zipWriter.Create("json.go")if err != nil {panic(err)}// 打开待压缩的文件f, err := os.Open("bec/json.go")if err != nil {panic(err)}defer f.Close()//需要压缩更多文件到压缩包的话,只需要重复第三步即可,只需要更换下文件名if _, err := io.Copy(w, f); err != nil {panic(err)}// 第四步,关闭 zip writer,将所有数据写入指向基础 zip 文件的数据流zipWriter.Close()
}

解压 ZIP 包

1、 使用 zip.OpenReader 打开 zip 包

package mainimport ("archive/zip"
)func main() {// 第一步,打开 zip 文件zipFile, err := zip.OpenReader("archive.zip")if err != nil {panic(err)}defer zipFile.Close()
}

2、 遍历 zip 中的文件,将压缩包的中的文件读取到本地文件

package mainimport ("archive/zip""io""os""path/filepath"
)func main() {// 第一步,打开 zip 文件zipFile, err := zip.OpenReader("archive.zip")if err != nil {panic(err)}defer zipFile.Close()// 第二步,遍历 zip 中的文件for _, f := range zipFile.File {filePath := f.Nameif f.FileInfo().IsDir() {_ = os.MkdirAll(filePath, os.ModePerm)continue}// 创建对应文件夹if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {panic(err)}// 解压到的目标文件dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())if err != nil {panic(err)}file, err := f.Open()if err != nil {panic(err)}// 写入到解压到的目标文件if _, err := io.Copy(dstFile, file); err != nil {panic(err)}dstFile.Close()file.Close()}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode] [Tutorial] 多维动态规划(未完待续)

文章目录 62. 不同路径Solution 62. 不同路径 一个机器人位于一个 m ∗ * ∗ n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 问总共有多少条不同的路径? 示例…

【electron】electron项目创建的方式:

文章目录 【1】npm init quick-start/electron(推荐)【2】 克隆仓库,快速启动【3】 通过脚手架搭建项目【4】 手动创建项目 【Electron官网】https://www.electronjs.org/zh/docs/latest/api/app 【1】npm init quick-start/electron&#xf…

Excelize Go语言操作 Office Excel文档基础库

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&#xf…

微信小程序实现左滑删除

一、效果 二、代码 实现思路使用的是官方提供的 movable-area:注意点,需要设置其高度,否则会出现列表内容重叠的现象。由于movable-view需要向右移动,左滑的时候给删除控件展示的空间,故 movable-area 需要左移 left:…

Android Gradle Plug-in(AGP ) 的对应关系

AGP 和 Gradle 版本的对应关系 Android Gradle 插件版本说明 | Android 开发者 | Android Developers 插件版本所需的最低 Gradle 版本8.18.08.08.07.47.57.37.47.27.3.37.17.27.07.04.2.06.7.1 旧版 插件版本所需的 Gradle 版本4.1.06.54.0.06.1.13.6.0 - 3.6.45.6.4…

sqlloader学习笔记

INFILE的用法 1)模糊导入多个数据的文件。 可以在文件名中使用通配符。 星号 (*) 表示复数字符,问号 (?) 表示单个字符。 INFILE emp*.dat INFILE m?emp.dat 2)如果不需要导入数据…

jQuery EasyUI datagrid 无记录时,增加“暂无数据“提示

我们只需要在onLoadSuccess中添加如下代码&#xff1a; if (data.total 0) {var body $(this).data().datagrid.dc.body2;body.find(table tbody).append(<tr><td width" body.width() " style"height: 35px; text-align: center;"><h…

C语言学习之封装自定义函数,实现atoi函数功能

实例要求&#xff1a;atoi函数的功能是把字符串转成整型数值并输出&#xff1b;把字符串"123456"转换成数值123456 &#xff0c;并返回数值&#xff1b;函数名&#xff1a; int myatoi(char *str);实例分析&#xff1a; 1.自定义的封装函数类型是整型&#xff0c;…

在阿里云Linux服务器上部署MySQL数据库流程

阿里云百科分享在阿里云Linux服务器上部署MySQL数据库流程&#xff0c;MySQL是一个关系型数据库管理系统&#xff0c;常用于LAMP和LNMP等网站场景中。本教程介绍如何在Linux系统ECS实例上安装、配置以及远程访问MySQL数据库。 目录 背景信息 Alibaba Cloud Linux 2/3、CentO…

上传excel文件

文件上传&#xff0c;其实就是用el-upload组件来实现上传&#xff0c;只是换了样式&#xff0c;和图片上传一样 <el-form-item label"选择文件"><el-input placeholder"请选择文件" v-model"form.file" disabled style"width: 45…

java 使用log4j显示到界面和文件 并格式化

1.下载log4j jar包https://dlcdn.apache.org/logging/log4j/2.20.0/apache-log4j-2.20.0-bin.zip 2. 我只要到核心包 &#xff0c;看需要 sources是源码包&#xff0c;可以看到说明。在IDEA里先加入class jar后&#xff0c;再双击这个class jar包或或右键选Navigate ,Add ,…

android.system.ErrnoException: open failed: EPERM (Operation not permitted)

android 10(Q)开始增加了沙盒机制&#xff0c;不能直接把文件保存到/sdcard目录下&#xff0c;只能保存到APP专属目录下&#xff1b;AndroidManifest.xml在标签下增加属性【android:requestLegacyExternalStorage“true”】可以暂时保存到/sdcard路径下&#xff0c;但是Android…

Revit SDK 介绍:PanelSchedule 配电盘明细表

前言 这个例子介绍 Revit 的配电盘明细表&#xff0c;PanelSchedule。Revit 的电器专业在国内用的并不是十分广泛&#xff0c;但从功能上来说还是比较完整的。 内容 这个例子里有三个命令&#xff1a; PanelScheduleExport - 导出配电盘明细表InstanceViewCreation - 创建配…

【0基础学爬虫】爬虫基础之网络请求库的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

【Visual Studio Code】--- Win11 C盘爆满 修改 Code 插件数据和缓存的保存路径

Win11 C盘爆满 修改 Code 插件数据和缓存的保存路径 一、概述二、修改 Code 插件数据和缓存的保存路径 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成…

领航优配:EFT交易是什么意思?

EFT买卖是一种电子资金搬运买卖方法&#xff0c;EFT代表电子资金搬运&#xff0c;将现金从一个银行账户搬运到另一个银行账户。尽管这种买卖方法已经存在了几十年&#xff0c;但随着技能的开展&#xff0c;越来越多的人开始使用它。 从技能视点&#xff0c;EFT买卖是经过计算机…

【C语言】memset()函数

一.memset()函数简介 我们先来看一下cplusplus.com - The C Resources Network网站上memset()函数的基本信息&#xff1a; 1.函数功能 memset()函数的功能是:将一块内存空间的每个字节都设置为指定的值。 这个函数通常用于初始化一个内存空间&#xff0c;或者清空一个内存空间…

elementui form组件出现英文提示

今天让解决一个bug&#xff0c;是表单组件提示词会出现英文。 问题情景如下&#xff1a; 有时会出现中文&#xff0c;有时会出现英文。 解决方法&#xff1a; 经查看&#xff0c;代码采用的是elementui的form组件&#xff0c;在el-form-item中使用了required属性&#xff0c;同…

html的语义化

说说对 html 语义化的理解 去掉或者丢失样式的时候能够让页面呈现出清晰的结构有利于 SEO&#xff1a;和搜索引擎建立良好沟通&#xff0c;有助于爬虫抓取更多的有效信息&#xff1a;爬虫依赖于标签来确定上下文和各个关键字的权重&#xff1b;方便其他设备解析&#xff08;如屏…

Fiddler

基础 Fiddler 相当于一个 “代理”,浏览器访问浏览器页面时&#xff0c;就会把HTTP请求先发给Fiddler&#xff0c;Fiddler 再把请求转发给浏览器的服务器&#xff0c;当浏览器服务器返回数据时&#xff0c;Fiddler拿到返回数据&#xff0c;再把数据交给浏览器。 主界面 删除…