热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golangzip文件解压与压缩

新一周的工作内容,基本就是研究这个zip文件的解压与压缩了。如上一篇一样,官方文档解释的并不是很清楚。google百度出来的结果都是有问题的࿰

新一周的工作内容,基本就是研究这个zip文件的解压与压缩了。如上一篇一样,官方文档解释的并不是很清楚。google百度出来的结果都是有问题的,要不就是文件压缩之后,压缩内容变0kb 要不就是文件写入之后解压出来不知道是个什么鬼了。我只用了这一种方式,其他的gzip和tar等有时间在研究。不过我想也都大同小异了。先上代码,然后再说说我在研究的时候遇到的问题吧。


文件压缩

/**
@files
:需要压缩的文件
@compreFile
:压缩之后的文件
*/

func Compress_zip(files []*os.File, compreFile *os.File) (err error) {zw := zip.NewWriter(compreFile)defer zw.Close()for _, file := range files {err := compress_zip(file, zw)if err != nil {return err}file.Close()}return nil
}/**
功能:压缩文件
@file
:压缩文件
@prefix
:压缩文件内部的路径
@tw
:写入压缩文件的流
*/

func compress_zip(file *os.File, zw *zip.Writer) error {info, err := file.Stat()if err != nil {logs.Error("压缩文件失败:", err.Error())return err}// 获取压缩头信息head, err := zip.FileInfoHeader(info)if err != nil {logs.Error("压缩文件失败:", err.Error())return err}// 指定文件压缩方式 默认为 Store 方式 该方式不压缩文件 只是转换为zip保存head.Method = zip.Deflatefw, err := zw.CreateHeader(head)if err != nil {logs.Error("压缩文件失败:", err.Error())return err}// 写入文件到压缩包中_, err = io.Copy(fw, file)file.Close()if err != nil {logs.Error("压缩文件失败:", err.Error())return err}return nil
}

压缩文件的时候有一个Header的概念


type FileHeader

type FileHeader struct {// Name是文件名,它必须是相对路径,不能以设备或斜杠开始,只接受'/'作为路径分隔符Name stringCreatorVersion uint16ReaderVersion uint16Flags uint16Method uint16ModifiedTime uint16 // MS-DOS时间ModifiedDate uint16 // MS-DOS日期CRC32 uint32CompressedSize uint32 // 已弃用;请使用CompressedSize64UncompressedSize uint32 // 已弃用;请使用UncompressedSize64CompressedSize64 uint64UncompressedSize64 uint64Extra []byteExternalAttrs uint32 // 其含义依赖于CreatorVersionComment string
}

以上就是官方文档给出的FileHeader的一些讲解,大概就是描述压缩文件中文件的一些信息的,比方说文件压缩前大小、压缩后大小这些、文件名这些,压缩文件就是创建出zip文件然后用zip.NewWriter()获得对文件的压缩写入流。之后通过压缩写入流,创建出压缩文件的Header 然后把文件写入到Header中。这样就能达到压缩文件的目的了。这之中有一个需要注意的是压缩方式的问题。

const (Store uint16 = 0 // 仅存储文件Deflate uint16 = 8 ) // 压缩文件

预定义压缩算法。
这是archive/zip包中预定义的两种压缩方式。一个是仅把文件写入到zip中。不做压缩。一种是压缩文件然后写入到zip中。

head.Method = zip.Deflate

如上就是设置文件的压缩模式。默认的Store模式。就是只保存不压缩的模式。


解压文件

/**
@tarFile
:压缩文件路径
@dest
:解压文件夹
*/

func DeCompressByPath(tarFile, dest string) error {srcFile, err := os.Open(tarFile)if err != nil {return err}defer srcFile.Close()return DeCompress(srcFile, dest)
}/**
@zipFile
:压缩文件
@dest
:解压之后文件保存路径
*/

func DeCompress(srcFile *os.File, dest string) error {zipFile, err := zip.OpenReader(srcFile.Name())if err != nil {logs.Error("Unzip File Error:", err.Error())return err}defer zipFile.Close()for _, innerFile := range zipFile.File {info := innerFile.FileInfo()if info.IsDir() {err = os.MkdirAll(innerFile.Name, os.ModePerm)if err != nil {logs.Error("Unzip File Error : " + err.Error())return err}continue}srcFile, err := innerFile.Open()if err != nil {logs.Error("Unzip File Error : " + err.Error())continue}defer srcFile.Close()newFile, err := os.Create(innerFile.Name)if err != nil {logs.Error("Unzip File Error : " + err.Error())continue}io.Copy(newFile, srcFile)newFile.Close()}return nil
}

这个没什么太大问题。只是解压文件出来创建文件夹保存


推荐阅读
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
手机用户2502875921
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有