Golang 文件压缩解压怎么做_Golang zip 与 tar 文件处理实战

Golang标准库支持zip和tar压缩解压。使用archive/zip可实现目录递归压缩与解压,需设置文件头及压缩方法;通过archive/tar结合gzip可创建和解压tar.gz文件,注意路径处理与目录创建。

golang 文件压缩解压怎么做_golang zip 与 tar 文件处理实战

在 Golang 中处理压缩文件是很多实际项目中常见的需求,比如日志归档、配置打包或文件传输。Golang 标准库提供了对 zip 和 tar 格式的支持,无需引入第三方依赖即可实现文件的压缩与解压。下面通过实战示例,带你掌握如何用 Go 实现 zip 与 tar 的压缩和解压操作。

zip 文件压缩与解压

zip 是跨平台最常用的压缩格式之一,Go 的 archive/zip 包支持读写 zip 文件。

压缩目录为 zip 文件

以下函数将指定目录递归压缩成一个 zip 文件:

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

func zipDir(source, target string) error {    zipfile, err := os.Create(target)    if err != nil {        return err    }    defer zipfile.Close()    archive := zip.NewWriter(zipfile)    defer archive.Close()    filepath.Walk(source, func(path string, info os.FileInfo, err error) error {        if err != nil {            return err        }        header, _ := zip.FileInfoHeader(info)        header.Name = strings.TrimPrefix(strings.Replace(path, source, "", -1), string(filepath.Separator))        if info.IsDir() {            header.Name += "/"        } else {            header.Method = zip.Deflate        }        writer, err := archive.CreateHeader(header)        if err != nil {            return err        }        if !info.IsDir() {            file, err := os.Open(path)            if err != nil {                return err            }            defer file.Close()            _, err = io.Copy(writer, file)        }        return err    })    return nil}

解压 zip 文件到目标目录

下面代码将 zip 文件解压到指定路径:

func unzip(source, target string) error {    reader, err := zip.OpenReader(source)    if err != nil {        return err    }    defer reader.Close()    for _, file := range reader.File {        filePath := filepath.Join(target, file.Name)        if file.FileInfo().IsDir() {            os.MkdirAll(filePath, os.ModePerm)        } else {            if err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {                return err            }            inFile, err := file.Open()            if err != nil {                return err            }            outFile, err := os.Create(filePath)            if err != nil {                inFile.Close()                return err            }            _, err = io.Copy(outFile, inFile)            outFile.Close()            inFile.Close()            if err != nil {                return err            }        }    }    return nil}

tar 文件压缩与解压

tar 常用于 Linux 系统打包,通常配合 gzip 使用(.tar.gz)。Go 提供了 archive/tar 包进行处理。

Fireflies.ai Fireflies.ai

自动化会议记录和笔记工具,可以帮助你的团队记录、转录、搜索和分析语音对话。

Fireflies.ai 145 查看详情 Fireflies.ai

创建 .tar.gz 压缩包

将目录压缩为 tar.gz 文件:

func tarGz(source, target string) error {    outfile, err := os.Create(target)    if err != nil {        return err    }    defer outfile.Close()    gzWriter := gzip.NewWriter(outfile)    defer gzWriter.Close()    tarWriter := tar.NewWriter(gzWriter)    defer tarWriter.Close()    filepath.Walk(source, func(path string, info os.FileInfo, err error) error {        if err != nil {            return err        }        header, err := tar.FileInfoHeader(info, "")        if err != nil {            return err        }        // 修正路径分隔符        header.Name = strings.TrimPrefix(strings.Replace(path, source, "", -1), string(filepath.Separator))        if err := tarWriter.WriteHeader(header); err != nil {            return err        }        if !info.IsDir() {            file, err := os.Open(path)            if err != nil {                return err            }            defer file.Close()            _, err = io.Copy(tarWriter, file)        }        return err    })    return nil}

解压 .tar.gz 文件

从 tar.gz 解压所有内容到目标目录:

func untarGz(source, target string) error {    file, err := os.Open(source)    if err != nil {        return err    }    defer file.Close()    gzReader, err := gzip.NewReader(file)    if err != nil {        return err    }    defer gzReader.Close()    tarReader := tar.NewReader(gzReader)    for {        header, err := tarReader.Next()        if err == io.EOF {            break        }        if err != nil {            return err        }        filePath := filepath.Join(target, header.Name)        switch header.Typeflag {        case tar.TypeDir:            if _, err := os.Stat(filePath); err != nil {                os.MkdirAll(filePath, os.ModePerm)            }        case tar.TypeReg:            dir := filepath.Dir(filePath)            os.MkdirAll(dir, os.ModePerm)            out, err := os.Create(filePath)            if err != nil {                return err            }            _, err = io.Copy(out, tarReader)            out.Close()            if err != nil {                return err            }        }    }    return nil}

使用建议与注意事项

处理压缩文件时,有几个关键点需要注意:

路径拼接使用 filepath.Join 避免跨平台问题 遍历目录时注意排除特殊文件(如 .DS_Store、符号链接等) 写入文件前确保父目录存在,避免报错 及时关闭文件句柄,推荐使用 defer tar 不自带压缩,需结合 gzip 才能生成 .tar.gz

对于 zip,文件头需要设置压缩方式(如 Deflate)以减小体积;tar 则直接写入原始数据流。

基本上就这些。Golang 对 zip 和 tar 的支持足够应对大多数场景,只要理解其基于流的处理逻辑,就能灵活实现各种打包解包功能。

以上就是Golang 文件压缩解压怎么做_Golang zip 与 tar 文件处理实战的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 20:20:04
下一篇 2025年12月1日 20:20:35

相关推荐

  • Chainbase($C币)是什么?怎么样?Chainbase全球最大全链数据网络的完整指南

    目录 什么是Chainbase($C代币)?Chainbase 为区块链数据和 AI 解决了哪些问题1. 区块链数据碎片化的挑战2. 缺乏人工智能数据标准3.集中数据控制和访问问题4.可扩展性和性能限制Chainbase Genesis:超数据网络背后的故事Chainbase 功能:四层架构和 AI…

    2025年12月8日 好文分享
    000
  • 币圈空投是真的吗?币圈空投网址大全

    本文将简要介绍怎样判断空投真实性的方法,并推荐一些靠谱的空投平台和资源,帮助你安全参与和学习操作流程。 如何判断空投是否真实 以下步骤可以帮助辨别真假: 1、核实官方来源:查看项目官网、X/Twitter、Telegram或Discord官方发布渠道,绝不通过非官方链接参与。 2、不提供私钥或助记词…

    2025年12月8日
    000
  • 稳定币的发行机制是怎样的?

    稳定币看行情交易平台: 欧易OKX: Binance币安: 火币Huobi: Gateio芝麻开门: 稳定币主要通过锚定特定资产或依靠算法来维持价值稳定,常见的发行机制有法币抵押、加密资产抵押和算法控制三种。具体如下: 法币抵押型:以美元等法币为储备,发行方每发行 1 枚稳定币,需在银行或其他金融机…

    好文分享 2025年12月8日
    000
  • Fragmetric(FRAG)是什么?怎么样?FRAG代币经济与未来前景分析

    目录 什么是 Fragmetric (FRAG)?Fragmetric 与 FRAG 代币的区别Fragmetric 解决了哪些问题?1. 传统 Staking 的资金效率低下2. 网络安全碎片化3. 复杂的产量优化4. DeFi 中的社区治理有限Fragmetric 的历史和背景Fragmetri…

    2025年12月8日 好文分享
    000
  • 2025年UNI币还值得买吗?一文解析Uniswap的机会与风险

    目录 Uniswap 最新进展与V4 升级UNI 代币的潜力与限制UNI 代币的三大亮点投资UNI 的潜在限制与风险:UNI与其他主流DeFi 协议的比较理性评估UNI 投资价值‍ Uniswap 最新进展与V4 升级 Uniswap Labs 于2025 年初推出了V4 升级,带来多项底层架构创新…

    2025年12月8日
    000
  • 币库交易所官网地址 coinbase交易所平台地址

    欢迎来到币库交易所(coinbase)。 coinbase 是美国最大的加密货币交易所之一,主要面向全球用户提供比特币(btc)、以太坊(eth)等数字货币的交易服务。作为一个全球知名的数字资产交易平台,coinbase为用户提供安全、便捷的加密货币交易和存储服务。本教程旨在详细指导您完成币库交易所…

    2025年12月8日
    000
  • 狗狗币为什么被称为“ meme 币”?有什么故事?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 狗狗币,这个在加密货币世界中独树一帜的存在,常常被冠以“ meme 币”的称号。与许多追求尖端技术或解决实际问题的加密货币不同,狗狗币的起源和发展与一种特定的互联网…

    2025年12月8日
    000
  • Reserve Rights Token(RSR)币是什么? RSR协议如何铸造RSV稳定币?

    目录 什么是Reserve Rights Token (RSR)?Reserve Rights Token (RSR) 如何运作?RSR 币的创始人是谁?RSR 币的独特之处是什么?RSR 币的价值来自哪里?RSR 币流通量是多少?RSR 币的其他技术数据 影响RSR币价格的因素RSR币价格预测20…

    2025年12月8日
    000
  • 欧易okx交易所APP最新版 欧易okx官方正版v6.126.1

    欢迎使用欧易okx交易所app,这是一个领先的数字资产交易平台,致力于为全球用户提供安全、专业、便捷的数字资产交易及管理服务。平台支持多种数字货币的交易,并提供丰富的金融衍生品。本文将为您提供欧易okx交易所app的官方正版下载链接,确保您下载到安全可靠的应用版本。 欧易官网直达: 欧易官方app:…

    2025年12月8日
    000
  • 怎么下载欧意交易所 欧意使用教程

    在%ignore_a_1%日益普及的今天,选择一个安全、便捷、功能强大的交易平台至关重要。欧意交易所(okx)作为全球领先的数字资产交易平台之一,凭借其丰富的交易品种、强大的安全保障和流畅的用户体验,吸引了众多投资者的目光。本教程将详细介绍如何下载欧意交易所,并提供全面的使用指南,帮助您快速上手,安…

    2025年12月8日
    000
  • OKX平台网页版登录地址 OKX网页版最新入口

    想要安全便捷地进入 okx 平台进行数字资产交易?okx 网页版为你提供了一个稳定可靠的选择。通过网页版,你无需下载任何客户端,即可在浏览器中直接访问 okx 的各项功能,包括交易、充提币、查看行情、参与活动等等。无论你使用 windows、macos 还是 linux 系统,只要拥有一个现代浏览器…

    2025年12月8日
    000
  • 币安正版交易所入口 Binance官网在线登录链接

    %ignore_a_1%,作为全球领先的加密货币交易平台,以其丰富的交易品种、强大的安全性以及便捷的用户体验赢得了全球用户的广泛认可。它不仅仅是一个简单的交易平台,更是一个集现货交易、合约交易、Launchpad、DeFi挖 矿等多种功能于一体的综合性数字资产服务生态系统。对于想要进入这个充满机遇的…

    2025年12月8日
    000
  • 马里奥卡丁车世界的新机制完全破坏了

    nintendo的switch 2平台本月初正式推出,而《mario kart world》便是首批随主机一同发售的游戏之一。 这款被寄予厚望的Mario Kart系列新作却在玩家群体中引发了巨大争议。许多用户反馈称游戏存在严重问题,甚至有人直言它“完全崩了”。 尽管本作引入了多种全新机制,旨在提升…

    2025年12月8日
    000
  • 币安的USDT怎么提现?TRC20和ERC20手续费差多少?

    币安 USDT 提现时,TRC20 网络手续费低于 ERC20。为确保安全高效提现,需先完成 KYC 验证、绑定正确地址,并了解 TRC20 基于波场、手续费低,ERC20 基于以太坊、手续费较高;操作步骤包括登录账户、进入资金页面、选择现货账户、点击 USDT 提现、正确选择网络类型(务必与接收地…

    2025年12月8日 好文分享
    000
  • 如何在马里奥卡丁车界种植硬币以解锁每辆车

    要解锁《马里奥卡丁车》中的所有车辆,您总共需要收集3,000枚硬币。 每获得100枚硬币就可以解锁一辆新卡丁车——而每场比赛大约只能获得25枚硬币,这个过程可能相当漫长。如果您希望在一小时之内完成全部解锁,其实有一种效率更高的方法可以实现快速刷币。 在自由漫游模式中,会有一些随机刷新的车辆,它们每隔…

    2025年12月8日
    000
  • btc看盘软件官网地址 btc看盘软件官方网页版入口

    BTC看盘软件应运而生,它不仅仅是一款简单的行情查看工具,更是您在数字货币交易世界中的得力助手。该软件集成了实时行情数据、专业的图表分析、个性化的预警设置等功能,旨在帮助用户更高效、更理性地进行交易。无论您是经验丰富的资深交易员,还是初入币圈的新手,这款软件都能满足您不同的需求,让您在波澜壮阔的数字…

    2025年12月8日
    000
  • 七大值得关注的链上新秀RWA项目:KTA/RWA/COLLAT/BUILDon/PVS/Linux/CVGT

    现在有哪些值得关注的新项目?随着传统金融巨头纷纷“带资进组”,叠加政策监管日趋清晰,rwa赛道正加速驶入主流视野。曾经属于小圈子探索的资产上链,如今正成为合规创新的桥头堡。而近期链上也悄然掀起一场“合规+想象力”的新浪潮,多个打着rwa标签的项目引发市场关注。 本文PANews盘点了最近7个活跃于R…

    2025年12月8日 好文分享
    000
  • 欧易官方入口正确地址 欧易下载教程

    欧易官方入口正确地址是:www.okx.com。该地址是欧易的全球官方网站,提供多语言支持和移动应用下载,确保用户数据安全和便捷交易体验。 进入欧易官方入口的正确地址是:。这个地址是欧易的全球官方网站,适用于大多数国家和地区的用户。访问该网站时,用户可以选择多种语言进行操作,极大地提升了用户体验。此…

    2025年12月8日
    000
  • 加密市场在周末进行价格更正,将比特币和以太坊陷入损失

    近期加密货币市场经历了一轮调整,多数加密资产出现下滑趋势。 上周末,加密市场的价格修正引起了广泛关注,导致大部分加密货币周一继续承压。比特币较前值下跌约2%,跌破105,000美元(约896万卢比)。据Coindcx和Coinswitch数据,作为历史最长、价值最高的加密货币,比特币跌幅达0.65%…

    2025年12月8日
    000
  • 欧亿ouyi交易平台v6.120.0官方最新安装版入口

    欧亿ouyi交易平台作为全球领先的数字资产交易平台,其最新版本v6.120.0已经发布。该版本在用户体验、安全性和功能性上都进行了显著的提升,旨在为用户提供更流畅、更安全的交易体验。无论你是新手还是资深交易者,欧亿ouyi交易平台都能满足你的需求。本文将详细介绍如何下载和安装欧亿ouyi交易平台v6…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信