阅读 575

golang中tar压缩和解压文件详情

这篇文章主要给大家介绍golang中tar压缩和解压文件,文章以查看官方文档自带的给大家演习一下golang的archive/tar压缩和解压功能,需要的朋友可以参考一下

目录
  • 1、压缩并输出tar.gz文档

  • 2、tar解压缩

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// 官方演示
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()
    }
  
}

1、压缩并输出tar.gz文档

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 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)
}

执行一下哈:

1
> go run compress.go

golang中tar压缩:

2、tar解压缩

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 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()
    }
}

执行一下:

1
> go run decompress.go 

golang中tar解压:

到此这篇关于golang中tar压缩和解压文件详情的文章就介绍到这了

原文链接:http://www.01happy.com/golang-tar/


文章分类
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐