- 什么是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)
}
}
解释一下
- 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中
image.png