golang代码解压文件并处理文件

        最近项目需求,需要前端页面将压缩文件传递打后台,然后后台再解压文件,对文件进行逐一进行处理。刚开始实现这个技术的时候本来想使用原生的库来进行解压处理,后面想着找找有造好的轮子应该可以拿来用,就在github上进行了搜寻,最后找到一个可以用的轮子,名字为archiver,github地址为:https://github.com/mholt/archiver

1、介绍

       此开源轮子支持rar,zip,7z等压缩格式,其他的压缩格式可以在github上的详情进行查看,因为我目前暂时只需要rar和zip的解压方式,7z格式虽然说是支持,但是我试过,解压的时候会报错,不支持该格式的压缩文件。不知道什么原因,我去issues提过问题,他们也没给个让人明白的答案,仿佛是支持,但是我测试出来是不支持的。因为我只需要解压功能,所以下面我只演示解压的使用方法,压缩的方法可以通过github自行测试研究。

2、使用方法

我测试代码的go版本使用的使用的是1.18.3版本,测试代码如下所示,比较简单,一看就能明白:

package mainimport ("context""fmt""io""os""github.com/mholt/archiver/v4"
)func main() {ArchiverTest("public.zip")
}// archiver解压压缩包
func ArchiverTest(path string) {f, _ := os.Open(path)format, readStream, err := archiver.Identify(path, f)if err != nil {return}extractor, ok := format.(archiver.Extractor)if !ok {return}switch extractor.(type) {case archiver.Zip:extractor = archiver.Zip{TextEncoding: "gbk"}fmt.Println("archiver.Zip")case archiver.SevenZip:extractor = archiver.SevenZip{}fmt.Println("archiver.SevenZip")case archiver.Rar:extractor = archiver.Rar{}fmt.Println("archiver.Rar")default:fmt.Println("unsupported compression algorithm")return}//fileList := []string{"file1.txt", "subfolder"}ctx := context.Background()handler := func(ctx context.Context, f archiver.File) error {filename := f.Name()newfile, err := os.Create(filename)if err != nil {panic(err)}defer newfile.Close()old, err := f.Open()if err != nil {panic(err)}defer old.Close()_, err = io.Copy(newfile, old)if err != nil {panic(err)}fmt.Printf("extracted %s \n", f.Name())return nil}err = extractor.Extract(ctx, readStream, nil, handler)if err != nil {return}}
  • 代码中可以看到通过一个解压函数将压缩文件传入,然后进行解压
  • 传入后,会对传入的压缩文件进行分类,代码中我分为了zip、rar和7z的压缩方式
  • err = extractor.Extract(ctx, readStream, nil, handler)的handler是前面定义的函数,属于回调函数,回调函数是对每一个解压出来的文件进行处理,代码示例中的操作是将压缩文件解压出来,然后保存到本地目录,然后还打印了解压后的文件名字
  • 回调函数是阻塞型的函数,里面没有调用携程来进行处理,所以回调函数要把解压后的所有文件处理完成后,该函数才会返回

3、回调函数参数传递

        如果需要传递参数到回调函数的话,可以使用如下代码进行传递参数:

package mainimport ("context""fmt""io""os""github.com/mholt/archiver/v4"
)type jellyString struct{}func main() {ArchiverTest("public.zip")
}// archiver解压压缩包
func ArchiverTest(path string) {f, _ := os.Open(path)format, readStream, err := archiver.Identify(path, f)if err != nil {return}extractor, ok := format.(archiver.Extractor)if !ok {return}switch extractor.(type) {case archiver.Zip:extractor = archiver.Zip{TextEncoding: "gbk"}fmt.Println("archiver.Zip")case archiver.SevenZip:extractor = archiver.SevenZip{}fmt.Println("archiver.SevenZip")case archiver.Rar:extractor = archiver.Rar{}fmt.Println("archiver.Rar")default:fmt.Println("unsupported compression algorithm")return}//fileList := []string{"file1.txt", "subfolder"}handler := func(ctx context.Context, f archiver.File) error {inputdata := ctx.Value(jellyString{}).(string)fmt.Printf("inputdata %s \n", inputdata )filename := f.Name()newfile, err := os.Create(filename)if err != nil {panic(err)}defer newfile.Close()old, err := f.Open()if err != nil {panic(err)}defer old.Close()_, err = io.Copy(newfile, old)if err != nil {panic(err)}fmt.Printf("extracted %s \n", f.Name())return nil}username := "传递参数用户名username"ctx := context.Background()ctxValue := context.WithValue(ctx, jellyString{}, username)err = extractor.Extract(ctxValue , readStream, nil, handler)if err != nil {return}}

传参数用的是一个结构体参数,据说是比较安全的传递参数的方法,我也按照这种建议的方式进行的参数传递,单个参数和结构体参数应该都可以传递。

4、小结

        解压文件我测试后还是可以针对rar和zip进行解压,并完整的将文件保存下来的,7z我测试无法成功,有成功的同学可以评论区分享,我怀疑可能是我go版本过低,没有亲自验证。还有就是如果你需要处文件的代码比较多的话,可以将回调函数写在外面,结构性要更强一些。

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

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

相关文章

宏的使用(C语言详解)

在写一个代码生成可执行文件的过程需要经过编译和链接&#xff0c;编译又要经过三部&#xff1a;预处理&#xff0c;编译&#xff0c;汇编。 #define定义的变量和宏就是在预处理阶段会处理的。 一个简单的宏定义&#xff1a; #include<stdio.h>; #define Max(a,b) a>…

计算机毕业设计选题之基于SSM的旅游管理系统【源码+PPT+文档+包运行成功+部署讲解】

&#x1f493;项目咨询获取源码联系v&#x1f493;xiaowan1860&#x1f493; &#x1f6a9;如何选题&#xff1f;&#x1f351; 对于项目设计中如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;有疑问不清晰的可…

SpringCloud Hystrix 服务熔断、服务降级防止服务雪崩

文章目录 SpringCloud Hystrix 熔断器、服务降级防止服务雪崩需求背景引入依赖启动类加Hystrix注解接口配置熔断常规配置超时断开错误率熔断请求数熔断限流 全局配置可配置项HystrixCommand.Setter参数Command Properties 服务降级 SpringCloud Hystrix 熔断器、服务降级防止服…

反射感测器简化光电开关设计

本文为大家介绍如何利用反射感测器的优势&#xff0c;以简化并改进微型光学感测器的设计。 反射感测器是设计微型光电开关的得力助手。它们精巧直观&#xff0c;可用来简化人机交互。这些感测器通常隐藏在红外 ( IR ) 透镜盖后面&#xff0c;当手指或其他物体接触镜盖表面时&a…

2024年4月7日16:58:09答辩笔记

尚硅谷总结毕业设计编写&#xff1a;&#xff08;ppt尽量好看点&#xff0c;放图&#xff08;流畅图&#xff0c;时序图放一放&#xff09;&#xff0c;少字&#xff0c;&#xff09; 总结&#xff1a;&#xff08;这样给人体验感要好&#xff0c;语言、逻辑清晰&#xff09; 1…

电脑桌面上的快捷方式提示没有应用相关联,需要设置默认应用

前言 一开始不知道自己究竟做了什么,电脑上的快捷方式点击任何一个都是顶着一串数字,提示没有应用相关联,此电脑,垃圾桶,网络,无论是电脑自带的快捷方式,还是自己创建的快捷方式,通通打不开 但是使用软件查看磁盘发现正常识别,通过软件可以浏览磁盘里的文件,究竟为什么? 解决…

Transformer架构的自注意力机制

自注意力机制&#xff08;Self-Attention&#xff09;&#xff0c;有时也称为内部注意力机制&#xff0c;是Transformer架构的核心。它是一种允许输入序列中的每个位置都能够考虑到序列中所有其他位置的机制&#xff0c;这样能够在每个位置捕获全局的上下文信息。自注意力机制使…

什么是JDK动态代理?怎么使用?

目录 一、什么是动态代理&#xff0c;有什么作用1、代理是什么2、代理在开发中的使用情况3、使用代理模式的作用 二、静态代理1、静态代理实现示例 三、动态代理1、动态代理的实现&#xff08;有两种&#xff09;1、CGLIB动态代理&#xff08;了解&#xff09;2、jdk动态代理&a…

【沈阳航空航天大学】【实验课程】《类与对象》实验

《类与对象》实验 《类与对象》实验任务书 一、实验要求 本次《类与对象》实验&#xff0c;是基于 “高级程序设计”和“高级程序设计实验”课程学习内容的重要实践环节&#xff0c;实验目的是通过综合性实验&#xff0c;培养学生面向对象程序设计思想&#xff0c;掌握类和对象…

Vue探索之Vue2.x源码分析(二)

一.Virtual Dom 虚拟DOM是一种轻量级的抽象&#xff0c;它允许我们在Javascript中创建、更新和删除DOM元素。它是React等现代Javascript框架的核心概念之一。 Vue的虚拟dom是一种抽象层的概念&#xff0c;它使得Vue可以高效地更新Dom。虚拟Dom是通过Javascript对象来表示DOM结…

vue实现验证码验证登录

先看效果&#xff1a; 代码如下&#xff1a; <template><div class"container"><div style"width: 400px; padding: 30px; background-color: white; border-radius: 5px;"><div style"text-align: center; font-size: 20px; m…

MySQL主从的介绍与应用

mysql主从 文章目录 mysql主从1. 主从简介1.1 主从作用1.2 主从形式 2. 主从复制原理3. 主从复制配置3.1 mysql安装&#xff08;两台主机安装一致&#xff0c;下面只演示一台主机操作&#xff09;3.2 mysql主从配置3.2.1 确保从数据库与主数据库里的数据一样3.2.2 在主数据库里…

log4j漏洞复现

1、apache log4j 是java语言中的日志处理套件/程序。2.0-2.14.1存在JNDI注入漏洞&#xff0c;导致攻击者可以控制日志内容的情况下&#xff0c;传入${jndi:ldap://xxxxxx.com/rce}的参数进行JNDI注入&#xff0c;执行远程命令。 JNDI&#xff1a; 命名和目录接口&#xff0c;…

苍穹外卖Day10——总结10

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/1363…

工厂方法模式:灵活的创建对象实例

在软件开发中&#xff0c;我们经常需要创建对象&#xff0c;但直接new一个实例可能会导致代码的耦合性增加&#xff0c;降低了代码的灵活性和可维护性。工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口…

基于单片机干湿垃圾自动分类系统

**单片机设计介绍&#xff0c;基于单片机干湿垃圾自动分类系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的干湿垃圾自动分类系统是一个集成传感器技术、机械控制和单片机编程于一体的自动化解决方案。该系统的主要目标是实…

算法| ss 合并区间

56.合并区间 56.合并区间 /*** param {number[][]} intervals* return {number[][]}*/ // 思路 区间合并 // 数组升序 // 取第一个元素作为pre // for循环遍历 // 条件判断&#xff1a; 如果当前开始大于pre的结尾&#xff0c;则存入pre&#xff0c; 更新pre为当前 // 否则 p…

死锁、活锁、饥饿三者之间的区别,Java 中导致饥饿的原因有哪些?为了避免饥饿,可以采取哪些措施

目录 面试官:死锁、活锁、饥饿的区别死锁(Deadlock)活锁(Livelock)饥饿(Starvation)面试官:Java 中导致饥饿的原因有哪些思维导图该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:死锁、活锁…

【趣味学算法】11_黑洞数

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 黑洞数又称陷阱数&…

Docker之镜像与容器的相关操作

目录 一、Docker镜像 搜索镜像 下载镜像 查看宿主机上的镜像 删除镜像 二、Docker容器 创建容器 查看容器 启停容器 删除容器 进入容器 创建/启动/进入容器 退出容器 查看容器内部信息 一、Docker镜像 Docker 运行容器前需要本地存在对应的镜像&#xff0c; 如…