golang压缩与解压缩文件

全代码实现,如有帮助,欢迎留下足迹。

目录

压缩

核心处理

解压缩


 

压缩

入口压缩函数

useBasePathInZip参数:

为 false 相当于全文件视图,zip中没有目录
为 true表示保留源文件的路径(srcPaths如果是相对路径,则压缩后zip文件中也是相对路径)

func compress(srcPaths []string, outputPath string, useBasePathInZip bool) {if len(srcPaths) == 0 {return}file, openErr := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)if openErr != nil {fmt.Printf("failed to open file %s: %v\n", outputPath, openErr)return}defer file.Close()zipWriter := zip.NewWriter(file)defer zipWriter.Close()for _, path := range srcPaths {info, err := os.Stat(path)if err != nil {fmt.Printf("failed to stat file %s: %v\n", path, err)return}if info.IsDir() {fmt.Printf("%s is dir...\n", path)err = addFilesToDirectory(zipWriter, path, "", useBasePathInZip)if err != nil {return}continue}fmt.Printf("%s is file...\n", path)if err = compressFile(zipWriter, path, useBasePathInZip); err != nil {log.Fatalf("add file %s to zip failed: %s", path, err)}}
}

核心处理

递归压缩目录中的所有文件

func addFilesToDirectory(zw *zip.Writer, newDir, baseInZip string, useBasePathInZip bool) error {files, err := ioutil.ReadDir(newDir)if err != nil {return err}fmt.Printf("目录 %s 下包含 %d 个对象.\n", newDir, len(files))var newBaseInZip stringfor _, fileInfo := range files {if useBasePathInZip {newBaseInZip = filepath.Join(baseInZip, fileInfo.Name())}newFullPath := filepath.Join(newDir, fileInfo.Name())fmt.Printf("\tcheck filename=%s, newFullPath=%s, newBaseInZip=%s \n", fileInfo.Name(), newFullPath, newBaseInZip)// 是目录,递归处理if fileInfo.IsDir() {if err = addFilesToDirectory(zw, newFullPath, newBaseInZip, useBasePathInZip); err != nil {return err}continue}// 处理单个文件if err = compressFile(zw, newFullPath, useBasePathInZip); err != nil {return err}}return nil
}

压缩单个文件

func compressFile(zw *zip.Writer, srcFile string, useBasePathInZip bool) error {fileToZip, err := os.Open(srcFile)if err != nil {log.Fatalf("compressFile failed to open %s: %v", srcFile, err)return err}defer fileToZip.Close()var zipFile io.Writerif !useBasePathInZip {// 获得源文件FileInfo对象info, err := fileToZip.Stat()if err != nil {fmt.Printf("failed to open file %s: %v\n", srcFile, err)return err}// 创建新的ZIP文件头,并设置其内部路径仅为文件名header, err := zip.FileInfoHeader(info)if err != nil {fmt.Printf("failed to create file header for %s: %v\n", srcFile, err)return err}fmt.Println("名称=", header.Name)// 设置压缩后的文件名为源文件名(去掉路径)header.Name = filepath.Base(srcFile)// 基于主zw流创建该文件的目标zip平台zipFile, err = zw.CreateHeader(header)if err != nil {return err}} else {zipFile, err = zw.Create(srcFile)if err != nil {return err}}// 将源文件Copy到目标zip平台_, err = io.Copy(zipFile, fileToZip)fmt.Printf("压缩 %s 完成 %v\n", srcFile, err)return err
}

调用压缩

func main() {var srcPaths = []string{"fzip/zipt/a.txt", "fzip/unzip.go"}compress(srcPaths, "./a.zip", true)
}

解压缩

func unzip(unzipFile, unzipDir string) {zipReader, _ := zip.OpenReader(unzipFile)for i, file := range zipReader.Reader.File {fmt.Printf("正在压缩第 %d 个. name=%s Comment=%s, isDir=%v, size=%d.\n", i+1, file.Name, file.Comment, file.FileInfo().IsDir(), file.FileInfo().Size())func(i int, file *zip.File) {zippedFile, err := file.Open()if err != nil {log.Fatal(err)}defer zippedFile.Close()extractedFilePath := filepath.Join(unzipDir, file.Name)if file.FileInfo().IsDir() {_ = os.MkdirAll(extractedFilePath, file.Mode()) // 权限不变fmt.Println("dir Created:", extractedFilePath)return}fmt.Println("file extracted: ", file.Name)func() {outputFile, err := os.OpenFile(extractedFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())if err != nil {log.Fatal(err)}defer outputFile.Close()_, err = io.Copy(outputFile, zippedFile)if err != nil {log.Fatal(err)}}()}(i, file)}
}

 

 

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

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

相关文章

【量子通信】量子通信技术:前景与挑战

量子通信技术:前景与挑战 一、技术背景二、技术原理量子叠加性:量子纠缠性:量子测量:量子不可克隆定理: 三、技术优缺点优点:安全性高:传输速度快:抗干扰性强:传输能力强…

CentOS 中文乱码

CentOS 中文乱码 1、 查看自己系统有没有安装中文语言包,可使用 locale -a 命令列出所有可用的语言环境 如果有中文,则不用安装,如果没有,需要重新安装,使用 yum install kde-l10n-Chinese 2、 修改 i18n 和 locale…

C++奇淫巧计:如何自助控制对象的初始化和销毁

需求 我们需要一个对象时&#xff0c;new 出来后自动根据需求&#xff0c;或是默认构造函数或是拷贝构造函数或是隐式转换&#xff0c;拿到手后就能用&#xff0c;习以为常。 但我们其实可以精确控制 new 的两个行为——内存分配、内存初始化。 代码 #include <iostream…

Mac OS中创建适合网络备份的加密镜像文件:详细步骤与参数选择

这篇文章提供了在Mac OS中创建适合网络备份的加密镜像文件的详细步骤&#xff0c;同时探讨了在选择相关参数时的关键考虑因素&#xff0c;以确保用户能够安全、高效地存储和保护重要数据。 创建步骤 在Mac OS Monterey中&#xff0c;你可以使用“磁盘工具”&#xff08;Disk …

【C++】初始化列表--再谈构造函数

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

PXI-1 Peripheral Module 64Bit 改混合槽 PXI Express Hybrid Slot

PXI PXIEPXI_LBR05VauxPXI_LBR2WAKE#PXI_LBR3ALERT#PXI_LBR412VPXI_LBR512VPXI_LBRL0/PXI_STAR0GNDPXI_LBRL1/PXI_STAR1GNDPXI_LBRL2/PXI_STAR2GNDPXI_LBRL3/PXI_STAR33.3VPXI_LBRL4/PXI_STAR43.3VPXI_LBRL5/PXI_STAR53.3V 实际就是拆掉这个 红黄框里的端子。。

UE4 C++ 动态加载类和资源

动态加载类和资源&#xff1a;指在运行时加载 .cpp void AMyActor::BeginPlay() {Super::BeginPlay();//动态加载资源UStaticMesh* MyTempStaticMesh LoadObject<UStaticMesh>(nullptr,TEXT("/Script/Engine.StaticMesh/Game/StarterContent/Shapes/Shape_NarrowC…

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---03信号(软件中断)源码分析

信号 实际使用看这一个 #if defined(RT_USING_SIGNALS)rt_sigset_t sig_pending; /**< the pending signals 记录来了的信号 */rt_sigset_t sig_mask; /**< the mask bits of signal 记录屏蔽的信号 */rt_sigh…

Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案

声明:原创文章,禁止转载! Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案 分析Android11 系统对于EMMC/UFS作为内部存储、SD卡被格式化为内部存储、SD卡/U盘被格式化为便携式存储的不同处理 一.现象描述 实测Android9 Android10 A…

Aigtek高精度电压源什么作用

高精度电压源是一种能够提供稳定、可靠且精确的电压输出的电子设备。它在科学研究、工程应用和制造业中起着至关重要的作用。以下将详细介绍高精度电压源的作用及其在不同领域的应用。 一、工作原理 稳定性&#xff1a;高精度电压源通常采用精密的电路设计和稳压技术&#xff0…

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它提供了许多特色功能&#xff0c;帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能&#xff1a; 智能代码编辑器&…

软件系统架构的演变历史介绍

个人浅见&#xff0c;不喜勿喷&#xff0c;非常感谢。 软件系统架构的演变历史与计算机技术的发展紧密相连。从最早的单一大型计算机&#xff0c;到个人计算机的兴起&#xff0c;再到互联网和云计算的普及&#xff0c;软件系统架构经历了多次重大的变革。以下是软件系统…

探索回溯算法

前言 回溯算法称之通用解算法&#xff0c;任何问题都可以优先使用回溯算法思考&#xff0c;再进行优化改进。那要问上一句回溯算法是怎样思维方式&#xff1f; 一&#xff0c;回溯算法思想 回溯算法是一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题…

Jgit Packfile is truncated解决方案

配置方式解决 这两个配置选项是用于提高 SSH 连接稳定性的 SSH 客户端配置参数&#xff0c;它们被添加到 SSH 配置文件&#xff08;通常是 ~/.ssh/config&#xff09;中。这些参数有助于在网络不稳定或者长时间无数据交换时保持 SSH 连接不被断开。下面是每个参数的具体作用&am…

【并行编程框架】AsyncTool

文章目录 AsyncToolAsyncTool是什么&#xff1f;AsyncTool快速入门1&#xff09;导入依赖2&#xff09;自定义Worker3&#xff09;编排包装类Wrapper4&#xff09;提交任务执行5&#xff09;运行结果 并发编程常见的场景串行并行阻塞等待 - 先串行&#xff0c;后并行阻塞等待 -…

电力负荷预测 | 基于TCN的电力负荷预测(Python)———数据预处理

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 基于TCN的电力负荷预测(Python) python3.8 keras2.6.0 matplotlib3.5.2 numpy1.19.4 pandas1.4.3 tensorflow==2.6.0

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决

ERR_SSL_KEY_USAGE_INCOMPATIBLE报错原因 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。这意味…

Unity笔记:相机移动

基础知识 鼠标输入 在Unity中&#xff0c;开发者在“Edit” > “Project Settings” > “Input Manager”中设置输入&#xff0c;如下图所示&#xff1a; 在设置了Mouse X后&#xff0c;Input.GetAxis("Mouse X")返回的是鼠标在X轴上的增量值。这意味着它会…

STM32TIM定时器(3)

文章目录 前言一、介绍部分输入捕获简介频率测量捕获比较通道主从模式输入捕获基本结构PWMI基本结构 二、代码部分使用输入捕获捕获另一个端口的PWM输入线路连接代码内容 PWMI获取频率占空比线路连接与上个案例一致代码实现 总结相关函数PSC、ARR都有1的误差 前言 这部分主要介…

Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全

文章目录 1. 引言2. 项目依赖配置3. 使用Lambda表达式配置Spring Security4. 自定义身份验证逻辑5. 认证与授权注解5.1 Secured注解5.2 PreAuthorize和PostAuthorize注解 6. 总结 &#x1f389;Spring Boot整合新版Spring Security&#xff1a;Lambda表达式配置优雅安全 ☆* o(…