当前位置: 首页 > article >正文

go 打包文件夹成zip文件

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.kler.cn/news/17367.html

相关文章:

  • Envoy控制面实践
  • 漫画 | Linux之父:财务自由以后,我失眠了!
  • 华为OD机试 - 整理扑克牌(Python)
  • [计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)
  • 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,基于 CentOS 7 构建 LVS-DR 群集
  • springboot 集成 shardingSphere 加mybatisplus 自带增加 分页查询 和源代码包 分库分表 单库 分表 使用雪花算法id
  • node.js 处理路径问题
  • VR与AR:哪个有更大的潜力改变未来?
  • 今天面了个字节跳动拿35K出来的,真是砂纸擦屁股,给我露了一手啊
  • Skywalking
  • gtest之高级主题
  • Spring常用注解总结
  • PAT A1024 Palindromic Number
  • Java对象的创建方式以及对象的引用
  • 【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~
  • Simulink 自动代码生成电机控制:弱磁控制从仿真到硬件开发板验证实验
  • 豪取BAT!超详细暑期实习算法面经(非科班无论文)
  • 如何监控一个程序的运行情况,然后视情况将进程杀死并重启
  • redis使用总结
  • 对传递函数的零极点、频率响应、稳定性的理解
  • Vue3 如何全局使用按钮截流指令
  • 复古决战快速施法穿墙秒怪分析流程及安全防护
  • 网络基础设施 拥塞控制
  • 基于JavaWeb实现的寻码网文章资讯管理系统
  • 动态页面配置
  • 我有一个方法判断你有没有编程天赋
  • ElasticSearch学习随笔之分词算法
  • 第17章 信息系统安全管理
  • IAST工具是如何工作的?主动和被动IAST有什么区别?
  • 信号完整性分析基础知识之传输线和反射(三):仿真和测试反射波形