go压缩的使用

基础:使用go创建一个zip

Go 复制代码
func base(path string) {
	// 创建 zip 文件
	zipFile, err := os.Create("test.zip")
	if err != nil {
		panic(err)
	}
	defer zipFile.Close()

	// 创建一个新的 *Writer 对象
	zipWriter := zip.NewWriter(zipFile)
	defer zipWriter.Close()

	// 创建一个压缩包中的文件
	fileWriter, err := zipWriter.Create("这个地方填文件的新名字.jpg")
	if err != nil {
		panic(err)
	}

	// 打开要压缩的文件
	f, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	// 将文件内容拷贝到 ZIP 文件中
	if _, err := io.Copy(fileWriter, f); err != nil {
		panic(err)
	}

	// zipWriter.Close() 在 defer 中已经处理
	println("ZIP 文件创建成功!")
}

这样可以得到一个path的压缩文件,打开如下:


想要得到一个具备层级的压缩文件,如下图:

需要先做的是创建所需的层级。

即,如果想要在压缩文件中呈现:

压缩文件:北京/朝阳区/美食地图.jpg

需要先创建 "北京/朝阳区/" 这个路径,而创建文件夹和创建文件的方式是一样的:

Go 复制代码
	// 创建一个路径
	_, err = zipWriter.Create("北京/朝阳区")
	if err != nil {
		panic(err)
	}

合起来就是:

Go 复制代码
func pathZip(path string) {
	// 创建 zip 文件
	zipFile, err := os.Create("test.zip")
	if err != nil {
		panic(err)
	}
	defer zipFile.Close()

	// 创建一个新的 *Writer 对象
	zipWriter := zip.NewWriter(zipFile)
	defer zipWriter.Close()

	// 创建一个路径
	_, err = zipWriter.Create("北京/朝阳区")
	if err != nil {
		panic(err)
	}
	// 创建一个压缩包中的文件
	fileWriter, err := zipWriter.Create("北京/朝阳区/美食地图.jpg")
	if err != nil {
		panic(err)
	}

	// 打开要压缩的文件
	f, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	// 将文件内容拷贝到 ZIP 文件中
	if _, err := io.Copy(fileWriter, f); err != nil {
		panic(err)
	}

	// zipWriter.Close() 在 defer 中已经处理
	println("ZIP 文件创建成功!")
}

注意,顺序不可以颠倒,要先创建路径,然后创建文件,然后再把文件拷贝到压缩包中。

如果要拷贝另一个文件,需要再创建一个文件且拷贝后才可以,不然之前的文件关闭了就无法再复制进去了。

下面这样是不可行的:

Go 复制代码
	// 创建一个压缩包中的文件
	fileWriter, err := zipWriter.Create("美食地图.jpg")
	if err != nil {
		panic(err)
	}
	// 创建一个压缩包中的文件
	fileWriter2, err := zipWriter.Create("美食地图2.jpg")
	if err != nil {
		panic(err)
	}

	// 打开要压缩的文件
	f, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	// 将文件内容拷贝到 ZIP 文件中
	if _, err := io.Copy(fileWriter, f); err != nil {
		panic(err)
	}
	// 将文件内容拷贝到 ZIP 文件中
	if _, err := io.Copy(fileWriter2, f); err != nil {
		panic(err)
	}

下面这样是可行的:

Go 复制代码
	// 创建一个压缩包中的文件
	fileWriter, err := zipWriter.Create("美食地图.jpg")
	if err != nil {
		panic(err)
	}

	// 打开要压缩的文件
	f, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	// 将文件内容拷贝到 ZIP 文件中
	if _, err := io.Copy(fileWriter, f); err != nil {
		panic(err)
	}
	// 创建一个压缩包中的文件
	fileWriter2, err := zipWriter.Create("美食地图2.jpg")
	if err != nil {
		panic(err)
	}

	// 将文件内容拷贝到 ZIP 文件中
	if _, err := io.Copy(fileWriter2, f); err != nil {
		panic(err)
	}

成功了:

相关推荐
魔力女仆7 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_894915538 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋9 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
FellAveal10 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
颜x小11 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_4236521311 小时前
C#使用JObject
开发语言·c#
国科安芯11 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
霸道流氓气质12 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
BerrySen17813 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构
Nebula_g13 小时前
Java实现本地Socket通信(三)
java·开发语言·学习·socket·可视化