网络编程
位置:首页>> 网络编程>> Go语言>> golang中tar压缩和解压文件详情

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

作者:快乐编程  发布时间:2024-05-10 13:58:46 

标签:golang,tar,压缩,解压文件
目录
  • 1、压缩并输出tar.gz文档

  • 2、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()
   }

}

1、压缩并输出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压缩和解压文件详情

2、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压缩和解压文件详情

来源:104.116.116.112.58.47.47.119.119.119.46.48.49.104.97.112.112.121.46.99.111.109.47.103.111.108.97.110.103.45.116.97.114.47.

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com