查看官方文档,官方自带的演示:
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压缩和解压文件详情的文章就介绍到这了,更多相关golang中tar压缩和解压文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:http://www.01happy.com/golang-tar/