本篇演示一下golang的archive/tar压缩和解压功能

官方演示

查看官方文档,官方自带的演示:

// 官方演示

package main

import (

"archive/tar"

"bytes"

"fmt"

"io"

"log"

"os"

)

func main() {

// 将若干文件写入压缩文档

// 这边源文件是直接写在代码里哈,然后也没有输出一个文档

// 后面会演示源文件进行压缩,然后输出一个tar.gz的压缩文档

var buf bytes.Buffer

tw := tar.NewWriter(&buf)

var files = []struct {

Name, Body string

}{

{"readme.txt", "This archive contains some text files."},

{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},

{"todo.txt", "Get animal handling license."},

}

for _, file := range files {

hdr := &tar.Header{

Name: file.Name,

Mode: 0600,

Size: int64(len(file.Body)),

}

if err := tw.WriteHeader(hdr); err != nil {

log.Fatal(err)

}

if _, err := tw.Write([]byte(file.Body)); err != nil {

log.Fatal(err)

}

}

if err := tw.Close(); err != nil {

log.Fatal(err)

}

// 上面压缩了之后,压缩内容都存储在buf这个变量里

// 这边遍历输出一下即可

tr := tar.NewReader(&buf)

for {

hdr, err := tr.Next()

if err == io.EOF {

break // 文件已经遍历完成了

}

if err != nil {

log.Fatal(err)

}

fmt.Printf("%s的文件内容: ", hdr.Name)

if _, err := io.Copy(os.Stdout, tr); err != nil {

log.Fatal(err)

}

fmt.Println()

}

}

压缩并输出tar.gz文档

官方的演示中并未将压缩的内容输出文档,实际使用中经常会用到。这边可用os库中的文件操作,将压缩内容写入文档,参考代码如下:

// tar压缩

// 这边演示一下从源文件进行压缩,然后输出一个tar.gz文档

// 参考地址:http://www.01happy.com/golang-tar/

package main

import (

"archive/tar"

"bytes"

"log"

"os"

)

func main() {

// 创建一个缓冲区用来保存压缩文件内容

var buf bytes.Buffer

// 创建一个压缩文档

tw := tar.NewWriter(&buf)

// 定义一堆文件

// 将文件写入到压缩文档tw

var files = []struct {

Name, Body string

}{

{"readme.txt", "This archive contains some text files."},

{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},

{"todo.txt", "Get animal handling license."},

}

for _, file := range files {

hdr := &tar.Header{

Name: file.Name,

Mode: 0600,

Size: int64(len(file.Body)),

}

if err := tw.WriteHeader(hdr); err != nil {

log.Fatal(err)

}

if _, err := tw.Write([]byte(file.Body)); err != nil {

log.Fatal(err)

}

}

if err := tw.Close(); err != nil {

log.Fatal(err)

}

// 将压缩文档内容写入文件 file.tar.gz

f, err := os.OpenFile("file.tar.gz", os.O_CREATE|os.O_WRONLY, 0666)

if err != nil {

log.Fatal(err)

}

buf.WriteTo(f)

}

执行一下哈:

> go run compress.go

a6df97bfd397c18c2482215219807f71.png

golang中tar压缩

tar解压缩

同上,可以使用os库将文档内容读入

// tar解压缩演示

// 这边演示一下从源文件进行解压,然后输出文件内容

// 参考地址:http://www.01happy.com/golang-tar/

package main

import (

"archive/tar"

"fmt"

"io"

"log"

"os"

)

func main() {

// 解压需要使用tar.NewReader方法, 这个方法接收一个io.Reader对象

// 那边怎么从源文件得到io.Reader对象呢?

// 这边通过os.Open打开文件,会得到一个os.File对象,

// 因为他实现了io.Reader的Read方法,所有可以直接传递给tar.NewReader

file, err := os.Open("file.tar.gz")

if err != nil {

log.Fatalln(err)

}

defer file.Close()

// tar对象读取文件内容, 遍历输出文件内容

tr := tar.NewReader(file)

for {

hdr, err := tr.Next()

if err == io.EOF {

break // End of archive

}

if err != nil {

log.Fatal(err)

}

fmt.Printf("%s文件内容:\n", hdr.Name)

if _, err := io.Copy(os.Stdout, tr); err != nil {

log.Fatal(err)

}

fmt.Println()

}

}

执行一下:

> go run decompress.go

1d866ba6314353e38b8bf7325b363e75.png

golang中tar解压