前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

归档

作者头像
酷走天涯
发布2019-05-26 16:19:43
1.1K0
发布2019-05-26 16:19:43
举报
  • 什么是tar
  • 内容写入归档
  • 如何从本地磁盘读取归档文件的内容呢?
什么是tar ?

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

内容写入归档
代码语言:javascript
复制
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()关闭归档写入

  • 如何将归档后的文件写入磁盘?
代码语言:javascript
复制
  ioutil.WriteFile("归档",buf.Bytes(),os.ModePerm)

image.png

如何从本地磁盘读取归档文件的内容呢?
代码语言:javascript
复制
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中

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是tar ?
  • 内容写入归档
  • 如何从本地磁盘读取归档文件的内容呢?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档