最新消息:活着是今年最大的利润

golang中tar压缩和解压文件

Golang 38浏览 0评论

本篇演示一下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 
golang中tar压缩

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  
golang中tar解压

golang中tar解压

转载请注明:快乐编程 » golang中tar压缩和解压文件

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址