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/