Golang如何实现文件压缩解压 实践archive/zip标准库操作

在 go 中使用 archive/zip 包可实现 zip 文件的压缩和解压。1. 创建 zip 文件需依次创建文件、初始化写入器、遍历源文件并添加至 zip;2. 解压 zip 需打开 zip 文件、遍历条目并根据类型创建目录或写入文件;3. 注意路径安全、权限控制、压缩级别限制及大文件处理。上述方法适用于大多数基础场景,但需注意资源释放与路径校验以避免安全隐患。

Golang如何实现文件压缩解压 实践archive/zip标准库操作

在 Golang 中,如果你需要对文件进行压缩或解压操作,最常用的方式就是使用标准库中的 archive/zip 包。它不需要额外依赖,直接可用,适合大多数基本的 ZIP 文件处理需求。

Golang如何实现文件压缩解压 实践archive/zip标准库操作

下面我们就来看看如何用这个包实现常见的压缩和解压功能。

Golang如何实现文件压缩解压 实践archive/zip标准库操作

如何创建一个 ZIP 压缩文件

要压缩文件,核心是使用 zip.Create() 创建 ZIP 文件,然后逐个添加文件进去。大致步骤如下:

立即学习“go语言免费学习笔记(深入)”;

创建目标 ZIP 文件使用 zipWriter := zip.NewWriter(file) 初始化写入器遍历需要压缩的文件,为每个文件创建一个 zip.FileHeader打开源文件并复制内容到 ZIP 写入器中

func compressFiles(zipPath string, filesToCompress []string) error {    newZipFile, err := os.Create(zipPath)    if err != nil {        return err    }    defer newZipFile.Close()    zipWriter := zip.NewWriter(newZipFile)    defer zipWriter.Close()    for _, filename := range filesToCompress {        fileToZip, err := os.Open(filename)        if err != nil {            return err        }        defer fileToZip.Close()        // 获取文件信息,用于构造 ZIP 条目        info, err := fileToZip.Stat()        if err != nil {            return err        }        header, err := zip.FileInfoHeader(info)        if err != nil {            return err        }        // 设置压缩方式        header.Method = zip.Deflate        writer, err := zipWriter.CreateHeader(header)        if err != nil {            return err        }        _, err = io.Copy(writer, fileToZip)        if err != nil {            return err        }    }    return nil}

这里需要注意的是,header.Name 默认是从路径中提取的文件名。如果你想改变 ZIP 里的路径结构,可以手动设置 header.Name 的值。

Golang如何实现文件压缩解压 实践archive/zip标准库操作

如何解压一个 ZIP 文件

解压的过程相对简单一些:打开 ZIP 文件、遍历其中的条目,然后依次读取并写入本地磁盘。

使用 zipReader, _ := zip.OpenReader(path) 打开 ZIP 文件遍历 zipReader.File 中的每一个条目如果是目录,就创建对应目录;如果是文件,就打开并写入数据

func extractZip(zipPath string, targetDir string) error {    reader, err := zip.OpenReader(zipPath)    if err != nil {        return err    }    defer reader.Close()    for _, f := range reader.File {        path := filepath.Join(targetDir, f.Name)        if f.FileInfo().IsDir() {            os.MkdirAll(path, os.ModePerm)            continue        }        if err := os.MkdirAll(filepath.Dir(path), os.ModePerm); err != nil {            return err        }        rc, err := f.Open()        if err != nil {            return err        }        defer rc.Close()        outFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())        if err != nil {            return err        }        defer outFile.Close()        io.Copy(outFile, rc)    }    return nil}

这段代码能处理 ZIP 中包含目录结构的情况。注意,在打开 ZIP 文件条目时,要记得关闭资源(比如 rc.Close()),避免资源泄露。

注意事项与常见问题

路径问题:ZIP 文件中的路径可能带有前缀或者层级结构,解压时如果不做处理可能会覆盖当前目录之外的内容。建议在解压前校验路径是否合法,防止“路径穿越”。权限问题:压缩和解压都需要对目标路径有写权限,否则会报错。压缩级别控制:archive/zip 默认使用 Deflate 算法,但不支持设置压缩等级,如需更高级别的控制,可以考虑第三方库。大文件处理:如果压缩或解压的是非常大的文件,建议使用流式处理,避免一次性加载全部内容导致内存占用过高。

基本上就这些。用 Go 标准库 archive/zip 实现 ZIP 文件的压缩和解压并不复杂,但在实际项目中要注意细节处理,比如路径安全、资源释放等。对于一般用途来说,这套方法已经足够实用了。

以上就是Golang如何实现文件压缩解压 实践archive/zip标准库操作的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1394623.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Go语言跨平台开发:一次编写多端运行
上一篇 2025年12月15日 12:21:32
Golang的unsafe.Pointer与普通指针有何不同 揭示类型安全与内存操作边界
下一篇 2025年12月15日 12:21:45

相关推荐

  • sublime怎么配置golang build system_sublime Golang Build System配置

    sublime怎么配置golang build system_sublime Golang Build System配置sublime怎么配置golang build system_sublime Golang Build System配置sublime怎么配置golang build system_sublime Golang Build System配置sublime怎么配置golang build system_sublime Golang Build System配置

    首先确保Go环境已安装并可用,然后在Sublime Text中创建自定义构建系统:通过Tools → Build System → New Build System添加支持go run、go build和gofmt的JSON配置,保存为Go.sublime-build至User目录;之后在.go文件…

    2026年9月26日 • 用户投稿
    100
  • sublime打开大文件很卡怎么办_sublime打开大文件优化方法

    sublime打开大文件很卡怎么办_sublime打开大文件优化方法sublime打开大文件很卡怎么办_sublime打开大文件优化方法sublime打开大文件很卡怎么办_sublime打开大文件优化方法sublime打开大文件很卡怎么办_sublime打开大文件优化方法

    通过优化设置可提升Sublime Text打开大文件的流畅度:1. 启用免打扰模式减少界面渲染负担,降低资源占用以改善性能。 Sublime Text 打开大文件卡顿,主要是因为默认设置会加载整个文件并启用语法高亮、自动缩进等特性,导致内存占用过高。虽然 Sublime 本身对大文件支持不如专用工具…

    2026年9月26日 • 用户投稿
    000
  • 用豆包AI实现Python内存管理优化

    用豆包AI实现Python内存管理优化用豆包AI实现Python内存管理优化用豆包AI实现Python内存管理优化用豆包AI实现Python内存管理优化

    豆包ai可通过分析内存使用模式、优化数据结构与对象创建、辅助编写内存友好代码帮助python内存管理优化。1. 发送代码片段给豆包ai,询问潜在内存问题,如循环引用或缓存未释放,并获得使用gc模块或弱引用的建议;2. 让豆包ai识别低效对象创建和不恰当数据结构,推荐生成器、itertools函数、节…

    2026年9月26日 • 用户投稿
    100
  • 显卡温度怎么测?新手必学安全散热检测技巧避免过热损坏显卡

    显卡温度怎么测?新手必学安全散热检测技巧避免过热损坏显卡显卡温度怎么测?新手必学安全散热检测技巧避免过热损坏显卡显卡温度怎么测?新手必学安全散热检测技巧避免过热损坏显卡显卡温度怎么测?新手必学安全散热检测技巧避免过热损坏显卡

    显卡温度过高会影响性能和硬件安全,新手可通过软件如msi afterburner、gpu-z等实时监测温度,并可在游戏中启用osd功能查看;也可通过bios或windows任务管理器间接判断;正常空闲温度为30℃~50℃,高负载下一般在60℃~85℃之间,超过90℃需警惕;定期清理灰尘、优化风道、检…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么配置golang的gopls_sublime集成Go语言gopls语言服务器教程

    sublime怎么配置golang的gopls_sublime集成Go语言gopls语言服务器教程sublime怎么配置golang的gopls_sublime集成Go语言gopls语言服务器教程sublime怎么配置golang的gopls_sublime集成Go语言gopls语言服务器教程sublime怎么配置golang的gopls_sublime集成Go语言gopls语言服务器教程

    首先安装gopls并确保在PATH中,然后通过Package Control安装LSP插件,接着在LSP设置中配置gopls的command、scopes、syntaxes和languageId,可选地添加initializationOptions以启用补全未导入包、参数占位符等功能,最后打开.go…

    2026年9月26日 • 用户投稿
    200
  • 如何在Android应用中加入AI功能 Android集成ML Kit的完整教程

    如何在Android应用中加入AI功能 Android集成ML Kit的完整教程如何在Android应用中加入AI功能 Android集成ML Kit的完整教程如何在Android应用中加入AI功能 Android集成ML Kit的完整教程如何在Android应用中加入AI功能 Android集成ML Kit的完整教程

    创建firebase项目并接入android应用:注册应用到firebase控制台,下载配置文件并添加google服务插件。2. 引入ml kit依赖:根据所需功能在build.gradle中添加对应依赖。3. 使用ml kit进行图像处理:以文字识别为例,获取图片、转为inputimage对象、初…

    2026年9月25日 • 用户投稿
    800
  • Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    本教程详细介绍了如何在Groovy中通过HTTP请求头发送授权令牌,以实现对RESTful API的安全访问。针对用户在Groovy中模拟curl -H ‘Authorization: token …’命令时遇到的常见问题,本文提供了基于java.net.URL和…

    2026年9月25日 • 用户投稿
    900
  • Debian系统如何配置Golang日志级别

    Debian系统如何配置Golang日志级别Debian系统如何配置Golang日志级别Debian系统如何配置Golang日志级别Debian系统如何配置Golang日志级别

    在debian系统上配置golang应用的日志级别,需要遵循以下步骤: 选择日志库: 首先,选择合适的日志库。Go标准库的log包功能简单,而第三方库如logrus和zap则提供更强大的功能和性能。 设置日志级别: 根据所选日志库,设置相应的日志级别。不同库的设置方法有所不同。 使用标准库log G…

    2026年9月25日 • 用户投稿
    300
  • 如何优化Debian上Golang日志的输出速度

    如何优化Debian上Golang日志的输出速度如何优化Debian上Golang日志的输出速度如何优化Debian上Golang日志的输出速度如何优化Debian上Golang日志的输出速度

    本文探讨在Debian系统上如何优化Golang应用的日志输出速度,提升系统效率。主要策略如下: 高效日志库的选择: 优先选择高性能的日志库,例如zap或logrus,它们通常比标准库log性能更优。 精简日志级别: 根据实际需求调整日志级别(debug、info、warn、error等)。开发环境…

    2026年9月25日 • 用户投稿
    900
  • 如何通过Golang日志诊断Debian网络问题

    如何通过Golang日志诊断Debian网络问题如何通过Golang日志诊断Debian网络问题如何通过Golang日志诊断Debian网络问题如何通过Golang日志诊断Debian网络问题

    本文介绍如何利用Golang日志机制在Debian系统中高效诊断网络问题。我们将探讨几种实用方法,帮助您快速定位并解决网络连接故障。 一、日志记录 标准库log包: Golang的log包是记录网络请求和响应细节的理想选择。 在发送请求前后添加日志,可以清晰地追踪请求的发送和接收过程。以下是一个简单…

    2026年9月25日 • 用户投稿
    000
  • Debian OpenSSL的依赖关系是什么

    Debian OpenSSL的依赖关系是什么Debian OpenSSL的依赖关系是什么Debian OpenSSL的依赖关系是什么Debian OpenSSL的依赖关系是什么

    在Debian系统中,OpenSSL的依赖关系涵盖系统库、开发工具以及一些可选组件。 本文将详细阐述这些依赖项,并提供安装建议。 核心依赖: C标准库 (libc6): OpenSSL依赖C标准库才能正常运行。 OpenSSL开发库 (libssl-dev): 包含OpenSSL的头文件和静态库,用…

    2026年9月25日 • 用户投稿
    200
  • DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理

    DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理

    要实现deepseek的自动扩缩容,核心在于根据负载动态调整资源。1. 首先确定监控指标,如gpu利用率、请求延迟、并发数等,优先关注服务压力关键指标;2. 设置扩缩策略,基于规则适用于周期性负载,基于预测适合波动无规律场景;3. 选择资源类型,spot实例适合容忍中断任务,按量付费适合高可用服务,…

    2026年9月25日 • 用户投稿
    000
  • 鸿蒙系统和安卓系统哪个更流畅

    鸿蒙系统和安卓系统哪个更流畅鸿蒙系统和安卓系统哪个更流畅鸿蒙系统和安卓系统哪个更流畅鸿蒙系统和安卓系统哪个更流畅

    总体而言,鸿蒙系统在流畅性上优于安卓系统。其优势在于:微内核架构提高响应速度;分布式技术实现跨设备协作;方舟编译器优化应用性能;实时调度优先处理重要任务。不过,安卓系统拥有更丰富的应用程序生态,满足用户多样化需求。 鸿蒙系统与安卓系统:流畅性对比 直接回答: 总体而言,鸿蒙系统在流畅性上优于安卓系统…

    2026年9月25日 • 用户投稿
    000
  • Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧

    Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧

    首先使用Shift+Esc打开Chrome任务管理器,查看各扩展程序的CPU和内存占用情况,识别高耗能插件;接着通过chrome://extensions页面禁用或删除异常扩展;最后可启用chrome://flags中的悬停显示内存功能,便于实时监控标签页资源消耗。 如果您发现Chrome浏览器运行…

    2026年9月25日 • 用户投稿
    300
  • 怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法

    怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法

    python内存泄漏可通过tracemalloc、objgraph及代码分析定位。1. 使用tracemalloc模块记录内存分配堆栈,生成快照并输出统计结果,交由豆包ai分析可疑内存泄漏点;2. 用objgraph查看常见对象类型及增长趋势,若发现异常增长对象可交由豆包判断是否合理;3. 将疑似泄…

    2026年9月24日 • 用户投稿
    100
  • Java中自定义与内置类同名冲突的解决方案:精确导入的实践

    Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践

    本文探讨了Java中自定义类与内置类(如LinkedList)同名时引发的编译错误。当项目中同时存在自定义LinkedList和java.util.LinkedList时,程序可能错误地引用自定义实现,导致方法找不到。教程指出,通过精确导入java.util.LinkedList而非通配符java.…

    2026年9月24日 • 用户投稿
    200
  • php-gd怎么销毁图像资源_php-gd释放内存中的图像

    使用imagedestroy()函数销毁PHP-GD图像资源以避免内存泄漏。创建的资源如$image需在处理后调用imagedestroy($image)释放,尤其在循环中应每轮结束前销毁资源,推荐结合is_resource()判断有效性,遵循“谁创建,谁销毁”原则,确保内存高效管理。 在使用 PH…

    2026年9月24日
    100
  • PHP如何批量处理图片_PHP实现多张图片自动化处理

    批量处理图片时需循环读取并逐个处理,核心是使用scandir()获取文件列表,通过GD库或Imagick处理图像,每处理完一张用imagedestroy()释放内存以避免内存溢出;为提升效率可分批处理、优化算法、使用多进程或异步队列,并选用Intervention Image等高效第三方库。 批量处…

    2026年9月24日
    200
  • 如何分析Linux进程内存 pmap内存映射检查方法

    如何分析Linux进程内存 pmap内存映射检查方法如何分析Linux进程内存 pmap内存映射检查方法如何分析Linux进程内存 pmap内存映射检查方法如何分析Linux进程内存 pmap内存映射检查方法

    要分析linux进程的内存,特别是利用pmap工具,核心操作是获取目标进程pid后执行pmap -x 。1. 获取pid可通过ps aux | grep your_process_name;2. 执行pmap -x 命令查看扩展格式信息,包括address、kbytes、rss、dirty、mode…

    2026年9月24日 • 用户投稿
    300
  • Java中接口常量和类常量的使用区别

    接口常量默认public static final,用于行为契约但易导致职责模糊;类常量可用不同访问修饰符,更适合封装和维护。现代Java推荐使用专用常量类、枚举、私有静态常量或配置文件管理常量,以提升代码清晰度与可维护性。 Java中接口常量和类常量,核心区别在于它们的定义位置和隐式属性。接口常量…

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信