0

0

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

P粉602998670

P粉602998670

发布时间:2025-11-20 10:34:55

|

326人浏览过

|

来源于php中文网

原创

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 包进行处理。

FastGPT
FastGPT

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统

下载

创建 .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如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号