Go语言实现tar.gz文件压缩与解压示例
本文详解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 语言文件处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









