Go语言实现tar.gz文件压缩与解压示例

青禾
青禾
发布时间:2026-10-15 | 5人浏览过
原创

本文详解Go语言利用标准库实现 tar.gz 文件的压缩与解压操作,涵盖关键参数设置与完整代码逻辑。

准备条件

Go 语言处理压缩包通常使用 .tar.gz 格式。这依赖于两个标准包:archive/tar 用于构建 tar 归档结构,compress/gzip 负责数据压缩。无需引入第三方依赖即可实现基础的文件写入与读取功能。

第1步:实现压缩功能

目的:将指定目录下的所有文件遍历并打包为 .tar.gz 文件。

核心逻辑:

  • 创建输出文件流并进行 gzip 压缩包装。
  • 初始化 tar 写入器,绑定至 gzip 层。
  • 递归或非递归地读取源目录文件列表(本例仅处理单级文件)。
  • 构造 tar.Header,填入文件名、大小、模式及修改时间等元数据。
  • 通过 io.Copy 将文件内容写入 tar 块。
复制代码 代码如下:
package main
import (
	"fmt"
	"os"
	"io"
	"archive/tar"
	"compress/gzip"
)
func main() {
	// 创建目标 .tar.gz 文件
	fw, err := os.Create("lin_golang_src.tar.gz")
	if err != nil {
		panic(err)
	}
	defer fw.Close()
	
	// 添加 gzip 压缩层
	gw := gzip.NewWriter(fw)
	defer gw.Close()
	
	// 添加 tar 写入层
	tw := tar.NewWriter(gw)
	defer tw.Close()
	
	// 打开待压缩的源目录
	dir, err := os.Open("file/")
	if err != nil {
		panic(nil)
	}
	defer dir.Close()
	
	// 读取目录中的文件列表
	fis, err := dir.Readdir(0)
	if err != nil {
		panic(err)
	}
	
	// 遍历并写入每个文件
	for _, fi := range fis {
		// 跳过子目录
		if fi.IsDir() {
			continue
		}
		
		fmt.Println(fi.Name())
		// 以只读方式打开文件
		fr, err := os.Open(dir.Name() + "/" + fi.Name())
		if err != nil {
			panic(err)
		}
		defer fr.Close()
		
		// 构建 tar 头信息
		h := new(tar.Header)
		h.Name = fi.Name()
		h.Size = fi.Size()
		h.Mode = int64(fi.Mode())
		h.ModTime = fi.ModTime()
		
		// 写入头部
		err = tw.WriteHeader(h)
		if err != nil {
			panic(err)
		}
		// 拷贝文件内容
		_, err = io.Copy(tw, fr)
		if err != nil {
			panic(err)
		}
	}
	fmt.Println("tar.gz ok")
}

第2步:实现解压功能

目的:读取已存在的 .tar.gz 文件,解包后将内容恢复到指定目录。

核心逻辑:

  • 打开压缩文件,依次反向解包:先由 gzip.NewReader 处理流,再由 tar.NewReader 解析结构。
  • 循环调用 tr.Next() 逐个获取文件头(Header)。
  • 遇到 io.EOF 时停止循环。
  • 根据 Header 中的名称在本地创建新文件,并使用 os.O_CREATE | os.O_WRONLY 权限打开。
  • 使用 io.Copy 从 Tar 读取器直接写出到本地磁盘。
复制代码 代码如下:
package main
import (
	"fmt"
	"os"
	"io"
	"archive/tar"
	"compress/gzip"
)
func main() {
	// 打开待解压的 tar.gz 文件
	fr, err := os.Open("lin_golang_src.tar.gz")
	if err != nil {
		panic(err)
	}
	defer fr.Close()
	
	// 解压缩 gzip 流
	gr, err := gzip.NewReader(fr)
	if err != nil {
		panic(err)
	}
	defer gr.Close()
	
	// 初始化 tar 读取器
	tr := tar.NewReader(gr)
	
	// 逐文件读取
	for {
		h, err := tr.Next()
		if err == io.EOF {
			break
		}
		if err != nil {
			panic(err)
		}
		
		fmt.Println(h.Name)
		// 在本地创建对应文件
		fw, err := os.OpenFile("file2/" + h.Name, os.O_CREATE | os.O_WRONLY, 0644)
		if err != nil {
			panic(err)
		}
		defer fw.Close()
		
		// 将文件内容写回本地
		_, err = io.Copy(fw, tr)
		if err != nil {
			panic(err)
		}
	}
	fmt.Println("un tar.gz ok")
}

上述过程展示了如何利用 Go 标准库高效完成数据存档与还原工作。以上就是 Go 语言实现 tar.gz 文件压缩与解压的详细内容,更多关于 Go 语言文件处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表