archive/tar
Package tar 实现对 tar 档案的访问。它的目的是涵盖大部分的变体(variations),其中包括 GNU 和 BSD tar生成的包。
import "archive/tar"
1
package main
import (
"archive/tar"
"bytes"
"fmt"
"io"
"log"
"os"
)
func main() {
// 创建一个缓冲区来写入我们的存档。
buf := new(bytes.Buffer)
// 创建一个新的tar存档。
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.Fatalln(err)
}
if _, err := tw.Write([]byte(file.Body)); err != nil {
log.Fatalln(err)
}
}
// 确保在Close时检查错误。
if err := tw.Close(); err != nil {
log.Fatalln(err)
}
// 打开tar档案以供阅读。
r := bytes.NewReader(buf.Bytes())
tr := tar.NewReader(r)
// 迭代档案中的文件。
for {
hdr, err := tr.Next()
if err == io.EOF {
// tar归档结束
break
}
if err != nil {
log.Fatalln(err)
}
fmt.Printf("Contents of %s:\n", hdr.Name)
if _, err := io.Copy(os.Stdout, tr); err != nil {
log.Fatalln(err)
}
fmt.Println()
}
}
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
62
63
64
65
66
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
62
63
64
65
66