go 打包文件夹成zip文件

news2024/9/30 11:37:42

go 打包文件夹成zip文件

代码有些乱,找不到合适的例子,和优雅的代码

当前代码打包文件是在 需要打包的目录下,测试的时候注意文件翻倍容量

writer, err := zzip.CreateHeader(header) //这里创建文件时注意不要用完整路径 zip中会生产完整路径的目录这里一定要注意,不然会生成完整路径的目录。

完整代码

16831076981624

applications 就是从根目录开始打包的

打包文件2 是相对路径打包的。

go 大概就是,file 对象不是文件本身,但是又有文件的属性,fileinfo文件信息等

// DownloadZip 下载Zip文件
// 下载指定路径文件,并且会在本地生产 zip包
// TODO ZIP文件怎么通过gin 传回前端
// TODO zip的目录层级不对
// TODO 删除本地额 zip
func (f *FileServer) DownloadZip(c *gin.Context) error {

	// 这里用的绝对路径 读取到本地文件到流
	var packPath = global.PRO_CONFIG.System.ProjectPath + DIR_PATH
	dirs, err := ioutil.ReadDir(packPath)
	if err != nil {
		return err
	}

	fileName := "打包文件2"
	// 创建zip 打包文件
	localZip, err := os.Create(packPath + fileName + ".zip")
	if err != nil {
		return err
	}

	// 可操作的流
	zipWriter := zip.NewWriter(localZip)
	defer zipWriter.Close()

	// 读取目录中的文件打包
	for _, file := range dirs {
		err := compress(file, packPath, zipWriter, packPath)
		if err != nil {
			return err
		}
	}

	// 设置响应头
	c.Header("Content-Dispostition", "attachment;filename="+fileName+".zip") // 文件名
	c.Header("Content-Type", "application/zip")                              // 文件传输类型 .zip
	//c.Writer.Write()
	return nil
}

// compres 根据文件 是dir 还是文件来 判断压缩
// file 传入文件
// dirPath 当前目录路径
// zzip zip读流
// zipPath 打包目录的路径
func compress(file os.FileInfo, dirPath string, zzip *zip.Writer, zipPath string) error {

	// 当前文件是目录时
	if file.IsDir() {
		// 拼接目录
		dirPathtwo := dirPath + file.Name() + "/"
		dir, err := ioutil.ReadDir(dirPathtwo)
		if err != nil {
			return err
		}
		// 读取目录下的文件
		for _, fi := range dir {
			f, err := os.Open(dirPathtwo + fi.Name())
			if err != nil {
				return err
			}
			defer f.Close()
			info, err := f.Stat()
			if err != nil {
				return err
			}
			err = compress(info, dirPathtwo, zzip, zipPath)
			if err != nil {
				return err
			}
		}
	} else {
		// 创建一个文 头部
		header, err := zip.FileInfoHeader(file)
		if err != nil {
			return err
		}
		// 绝对路径
		header.Name = dirPath + header.Name

		// 打开完整路径
		f, err := os.Open(header.Name)
		if err != nil {
			return err
		}
		// 路径改为打包目录的相对路径
		header.Name = header.Name[len(zipPath):]

		writer, err := zzip.CreateHeader(header) //这里创建文件时注意不要用完整路径 zip中会生产完整路径的目录
		if err != nil {
			return err
		}
		_, err = io.Copy(writer, f)
		defer f.Close()
		if err != nil {
			return err
		}
	}
	return nil
}

16831062526272

os API 简述

api说明补充
os.Create给定的路径创建一个新的文件 同名文件就被覆盖 需要上一级目录存在此函数创建的文件所有用户可读写
os.NewFile该函数被调用的时候,需要接受一个代文件描述的uintptr类型的值,以及一个表示文件名的字符串值 此方法不能创建一个新文件,是根据已有文件的描述,新建一个包装的该文件的file值
os.Open打一个文件并返回包装了该文件的file值 只读模式打开文件,文件对象不可写入
os.OpenFIle参数:name、flag、perm name:文件路径 flag: 文件描述符上的操作模式。读、写 perm:权限模式os.OpenFile(“path”,os.O_RDWR,6666)

操作模式

os.O_APPEND:当向文件中写入内容时,把新内容追加到现有内容的后边。

os.O_CREATE:当给定路径上的文件不存在时,创建一个新文件。

os.O_EXCL:需要与os.O_CREATE一同使用,表示在给定的路径上不能有已存在的文件。

os.O_SYNC:在打开的文件之上实施同步 I/O。它会保证读写的内容总会与硬盘上的数据保持同步。

os.O_TRUNC:如果文件已存在,并且是常规的文件,那么就先清空其中已经存在的任何内容。

权限:这里是八进制无符号

八进制整数0777就表示:操作系统中的所有用户都对当前的文件有读、写和执行的权限,而八进制整数0666则表示:所有用户都对当前文件有读和写的权限,但都没有执行的权限。

完整代码

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

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

相关文章

【51单片机】蜂鸣器

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 🍔效果 (注意听声音哦) 按…

Blob File

文章目录 学习链接Blob创建演示 分片演示 Fileinput手动拖拽fetch 从后端获取流前端代码后端代码 window.showOpenFilePicker Filereader示例1示例2 ArrayBuffer创建bufferTypedArray读写bufferDataView读写buffer与Blob对比 Blob Url & DataUrl示例1示例2 学习链接 Blog …

WIFI密码hacking学习

1 wifite sudo -i 切换到root终端,执行wifite CtrlC 停止WIFI列表扫描 这里选择爆破目标1,他会先监听客户端和wifi的连接的数据包,然后用wordlist-probable.txt里面的字典进行爆破 区别 WPS 是 no 的和yes no会自动化爆破 这种模式默认下…

软件测试行业前景怎么样

软件测试工程师工作好找,但是企业有时却很难招聘到合适的软件测试工程师,这是因为现在企业需要的是自动化测试人才和测试开发人才!前些年的手动测试员早已不能满足企业现在的发展需求。 随着人工智能时代的到来,IT行业受到了越来…

从‘孔乙己长衫’现象看社会不公

孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。 认识孔乙己 孔乙己是清朝末年的小贩,生活在贫苦的阶层…

ubuntu22.04安装与配置

目录 一、环境及下载 iso下载 VM配置 二、虚拟机与环境配置 虚拟机开始后的配置 一些工具配置 参考: VMware Workstation Pro 文档 一、环境及下载 iso下载 Download Ubuntu Desktop | Download | Ubuntu 新出了23但是偶数年份稳定支持,所以我…

openai接口调用-如何接入openai获取 api key

openai api key获取 获取 OpenAI API Key 非常简单,您只需要按照以下步骤进行操作: 创建 OpenAI 账户。如果您还没有 OpenAI 账户,请访问 OpenAI 官网(http://openai.com/signup)并创建一个帐户。登录您的 OpenAI 账户。使用您的…

docker安装ES、kibana和IK分词器

拉取镜像 docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2创建存储数据的目录 mkdir -p /home/lab1018/docker_volume/elasticsearch/config mkdir -p /home/lab1018/docker_volume/elasticsearch/data mkdir -p /home/lab1018/docker_volume/elasticsearch/plugi…

C++-----动态规划

目录 一、动态规划的基本思想 二、设计动态规划法的步骤 三、动态规划问题的特征 4.1 矩阵连乘积问题 4.1.1 分析最优解的结构 4.1.2 建立递归关系 4.1.3 计算最优值 4.1.3 计算最优值 4.1.3 构造最优解 4.2 动态规划算法的基本要素 4.2.1 最优子结构 4.2.2 重叠子问题 …

gRPC结合vcpkg在x64-windows平台visual studio2019 cmake工程里面的应用

这里我们运用vcpkg去下载安装gRPC,进入vcpkg目录后,执行命令:.\vcpkg.exe install grpc:x64-windows grpc在vcpkg里面安装完成后,我们就来使用grpc做一个简单的例子。 gRPC顾名思义,就是google的RPC方案,…

ProtoBuf 编码原理

因为涉及到分布式集群之间的通信,所以来学习了下 ProtoBuf,为什么选择 ProtoBuf 呢?主要还是因为相对于 json , xml 来说,ProtoBuf 传输效率更快,故需要了解下它的编码设计。 首先,每一个 message 进行编码…

科研人必看入门攻略(收藏版)

来源:投稿 作者:小灰灰 编辑:学姐 本文主要以如何做科研,日常内功修炼,常见科研误区,整理日常‘好论文’四个部分做以介绍,方便刚入门的科研者进行很好的规划。 1.如何做科研 1.1 选方向 当我…

【2023年第十一届泰迪杯数据挖掘挑战赛】A题:新冠疫情防控数据的分析 32页和40页论文及实现代码

【2023年第十一届泰迪杯数据挖掘挑战赛】A题:新冠疫情防控数据的分析 32页和40页论文及实现代码 相关链接 (1)建模方案 【2023年第十一届泰迪杯数据挖掘挑战赛】A题:新冠疫情防控数据的分析 建模方案及python代码详解 &#x…

【初学人工智能原理】【4】梯度下降和反向传播:能改(下)

前言 本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白,由于缺少图片可能无法理解,故放到了最后,建议直接看代码(代码放到了前面)。 代码实…

《LearnUE——基础指南:开篇—2》——准备工作

目录 0.2.1 UE的获取与创建项目 0.2.2 UE4编辑器界面布局 1. 编辑器介绍 2. 新建蓝图与蓝图拖动 3. 菜单介绍 4. 工具栏介绍 0.2.3 学习资料 0.2.1 UE的获取与创建项目 登录UE官网:www.unrealengine.com 点击“登录”,如果没有账号&#xff0…

自动驾驶——离散系统LQR的黎卡提方程Riccati公式推导与LQR工程化

1.LQR Question Background 之前写过连续系统的黎卡提方程Riccati推导,但是考虑到实际工程落地使用的是离散系统,于是又进行了离散黎卡提方程Riccati的公式推导。 2.Proof of Riccati Equation Formula for Discrete Systems 工程化落地,就是使用公式(2-14)实时计算控制率…

Windows编译安装AzerothCore魔兽世界开源服务端Lua脚本引擎Eluna和防作弊anticheat模块教程

Windows编译安装AzerothCore魔兽世界开源服务端Lua脚本引擎Eluna和防作弊anticheat模块教程 大家好,我是艾西今天和大家聊聊魔兽世界游戏内的脚步以及防作弊模块 Eluna是azerothcore服务端的Lua脚本引擎,可以在原有azerothcore的基础上实现很多拓展以及…

Linux操作系统指令(1)

目录 一、什么是Linux操作系统?二、Linux基本指令12.1 ls指令2.2 pwd指令2.3 cd指令2.4 touch指令2.5 mkdir指令(非常重要)2.6 rmdir指令 && rm 指令(十分重要)2.7 man指令(非常重要)2.…

基于松鼠算法的极限学习机(ELM)回归预测-附代码

基于松鼠算法的极限学习机(ELM)回归预测 文章目录 基于松鼠算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于松鼠算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要:本文利用松鼠算法对极限学习机进行优化,并…

设计模式-创建型模式-(工厂、简单工厂、抽象工厂)

一、简单工厂模式 上代码 public class FoodFactory {public static Food makeFood(String name) {if (name.equals("noodle")) {Food noodle new LanZhouNoodle();noodle.addSpicy("more");return noodle;} else if (name.equals("chicken")…