归档

  • 什么是tar
  • 内容写入归档
  • 如何从本地磁盘读取归档文件的内容呢?

什么是tar ?

tar是“tape archive”(磁带存档)的简称,它出现在还没有软盘驱动器、硬盘和
光盘驱动器的计算机早期阶段,随着时间的推移, tar命令逐渐变为一个将很多文件进行存档的工具,目前许多用于Linux操作系统的程序就是打包为tar档案文件的形式。 在Linux里面,tar一般和其他没有文件管理的压缩算法文件结合使用,用tar打包整个文件目录结构成一个文件,再用gz,bzip等压缩算法压缩成一次。也是Linux常见的压缩归档的处理方法

内容写入归档

package main

import (
  "archive/tar"
  "bytes"
  "fmt"
  "io"
  "log"
  "os"
  "io/ioutil"
)

func main() {
  // 1.创建一个缓冲区来写入我们的存档。
  buf := new(bytes.Buffer)

  // 2.创建一个新的tar存档。
  tw := tar.NewWriter(buf)


  // 3.将一些文件添加到存档中。
  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 {
    // 创建tar的头
    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)
    }

  }
  // 4. 确保在Close时检查错误。
  if err := tw.Close(); err != nil {
    log.Fatalln(err)
  }
}

解释一下

  1. bytes.Buffer 是一个结构体 new 方法的作用就是传入一个类型 返回一个对应的指针类型

2.归档写入类型 tar.NewWriter(buf) 参数是一个缓冲类型的指针

3.写入归档文件时 需要先创建一个文档的头部 tar.Header 添加相应的参数 比如文件的名称 文件长度 和模式等等

4.内容全部写入归档缓冲区后,请调用close()关闭归档写入

  • 如何将归档后的文件写入磁盘?
  ioutil.WriteFile("归档",buf.Bytes(),os.ModePerm)
image.png

如何从本地磁盘读取归档文件的内容呢?

package main

import (
  "archive/tar"
  "bytes"
  "fmt"
  "io"
  "log"
    "io/ioutil"
)

func main() {

   // 1.读取文件内容到缓冲区 []byte 中
   b,err:= ioutil.ReadFile("归档")
   if(err != nil){
     log.Fatal(err)
   }

  // 2.创建一个归档读取类型的变量
  r := bytes.NewReader(b)
  tr := tar.NewReader(r)

  // 3.迭代档案中的文件。一个文件一个文件读取
  for {
    hdr, err := tr.Next()
    if err == io.EOF {
      // tar归档结束
      break
    }
    if err != nil {
      log.Fatalln(err)
    }
     
   // 4.读取内容
    buf := new(bytes.Buffer)
    
    if _, err := io.Copy(buf, tr); err != nil {
      log.Fatalln(err)
    }
    fmt.Printf("Contents name: %s\n", hdr.Name)
    fmt.Printf("Contents body: %s\n", buf)
  }

解释一下

1.ioutil.ReadFile 这句代码是读取指定路径下的文件到缓冲区
2.创建一个专门读取归档文件的变量,参数就是从磁盘读到的缓冲区的字节流
3.tr.Next()表示移动到读取下一个归档文件的入口
4.buf := new(bytes.Buffer) 创建一个内容接受缓冲区 io.Copy(buf, tr) 拷贝tr中的缓冲内容到buf中

归档_第1张图片
image.png

你可能感兴趣的:(归档)