内容简介:go语言官方标准库提供tar库,以方便对tar的操作一、了解tar什么是tar?
go语言官方标准库提供tar库,以方便对tar的操作
一、了解tar
什么是tar?
tar是一种打包格式,但不对文件进行压缩,所以打包后的文档一般远远大于zip和tar.gz,因为不需要压缩的原因,所以打包的速度是非常快的,打包时CPU占用率也很低。
tar的目的是什么?
方便文件的管理(帮助理解:就是你存在很多文件的时候,但是你很多要很长时间不去接触的话,你想要变得更加简洁,可以进行tar操作,就可以变得更简洁,比如就像生活中,有很多小箱子分散在不同的房间里,可以将小箱子叠起来放在一个房间里,tar可以类似这样)
下面一张图可以帮助很好的理解
image.png
)
二、tar的操作
打包、解包
三、 go 如何对tar文件操作
打包操作:
1、生成打包后的目标文件
2、获取要打包的文件集
3、往目标文件写入文件
接着给出一个代码案例:
package main
import (
"log"
"os"
"archive/tar"
"io"
)
func main() {
dst := "D:\\go_code\\video_server\\src\\a.tar"
if err := Tar([]string{"D:\\go_code\\video_server\\src\\main.go", "D:\\go_code\\video_server\\src\\t.go"}, dst);err != nil {
log.Fatal(err)
}
}
func Tar(src []string, dst string) error {
// 创建tar文件
fw, err := os.Create(dst)
if err != nil {
return err
}
defer fw.Close()
// 通过fw创建一个tar.Writer
tw := tar.NewWriter(fw)
// 如果关闭失败会造成tar包不完整
defer func() {
if err := tw.Close();err != nil {
log.Println(err)
}
}()
for _, fileName := range src {
fi, err := os.Stat(fileName)
if err != nil {
log.Println(err)
continue
}
hdr, err := tar.FileInfoHeader(fi, "")
// 将tar的文件信息hdr写入到tw
err = tw.WriteHeader(hdr)
if err != nil {
return err
}
// 将文件数据写入
fs, err := os.Open(fileName)
if err != nil {
return err
}
if _, err = io.Copy(tw, fs);err != nil {
return err
}
fs.Close()
}
return nil
}
解包操作:
1、打开tar文件
2、遍历tar中文件信息
3、创建文件,写入,保存,关闭文件
接着给出一个代码案例:
package main
import (
"os"
"log"
"archive/tar"
"io"
)
func main() {
srcFile := "a.tar"
// 打开 tar 包
fr, err := os.Open(srcFile)
if err != nil {
log.Fatal(err)
}
defer fr.Close()
tr := tar.NewReader(fr)
for hdr, err := tr.Next();err != io.EOF;hdr, err = tr.Next() {
if err != nil {
log.Println(err)
continue
}
// 读取文件信息
fi := hdr.FileInfo()
// 创建一个空文件,用来写入解包后的数据
fw, err := os.Create(fi.Name())
if err != nil {
log.Println(err)
continue
}
if _, err := io.Copy(fw, tr);err != nil {
log.Println(err)
}
os.Chmod(fi.Name(), fi.Mode().Perm())
fw.Close()
}
}
四、tar包深入学习(作为一名计算机专业人士,至少要知道原理和实现的,接着我们来分析下原理和实现)
打包和解包的原理和实现
1、打包实现原理
先创建一个文件x.tar,然后向x.tar写入tar头部信息。打开要被tar的文件,向x.tar写入头部信息,然后向x.tar写入文件信息。重复第二步直到所有文件都被写入到x.tar中,关闭x.tar,整个过程就这样完成了
2、解包实现原理
先打开tar文件,然后从这个tar头部中循环读取存储在这个归档文件内的文件头信息,从这个文件头里读取文件名,以这个文件名创建文件,然后向这个文件里写入数据
3、go标准库解包实现代码详解
打包:
// 接下来对底层实现进行分析
tr := tar.NewReader(fr)
hdr, err := tar.FileInfoHeader(fi, "")
// 将tar的文件信息hdr写入到tw
err = tw.WriteHeader(hdr)
解包:
fr, err := os.Open(srcFile)
tr := tar.NewReader(fr)
hdr, err := tr.Next()
fi := hdr.FileInfo()
fw, err := os.Create(fi.Name())
io.Copy(fw, tr)
os.Chmod(fi.Name(), fi.Mode().Perm())
tar.NewReader、tar.FileInfoHeader、tw.WriteHeader(hdr)、tr.Next、hdr.FileInfo的实现在我下一篇文章中进行分析
// 看一遍代码可能不能深入理解,只有自己是实现一遍才能深入理解 // go 标准库封装windows、 linux 、FreeBSD、mac四类操作系统底层细节操作,因为不同的系统对文件存储方式不同,所以定义了下面这些常量 const ( // 类型 TypeReg = '0' // 普通文件 TypeRegA = '\x00' // 普通文件 TypeLink = '1' // 硬链接 TypeSymlink = '2' // 符号链接 TypeChar = '3' // 字符设备节点 TypeBlock = '4' // 块设备节点 TypeDir = '5' // 目录 TypeFifo = '6' // 先进先出队列节点 TypeCont = '7' // 保留位 TypeXHeader = 'x' // 扩展头 TypeXGlobalHeader = 'g' // 全局扩展头 TypeGNULongName = 'L' // 下一个文件记录有个长名字 TypeGNULongLink = 'K' // 下一个文件记录指向一个具有长名字的文件 TypeGNUSparse = 'S' // 稀疏文件 ) // 有四个变量,分别是写内容太多,头部信息太长,关闭错误,以及无效tar头部信息 var ( ErrWriteTooLong = errors.New("archive/tar: write too long") ErrFieldTooLong = errors.New("archive/tar: header field too long") ErrWriteAfterClose = errors.New("archive/tar: write after close") ) var ( ErrHeader = errors.New("archive/tar: invalid tar header") ) type Header struct { Name string // 记录头域的文件名 Mode int64 // 权限和模式位 Uid int // 所有者的用户ID Gid int // 所有者的组ID Size int64 // 字节数(长度) ModTime time.Time // 修改时间 Typeflag byte // 记录头的类型 Linkname string // 链接的目标名 Uname string // 所有者的用户名 Gname string // 所有者的组名 Devmajor int64 // 字符设备或块设备的major number Devminor int64 // 字符设备或块设备的minor number AccessTime time.Time // 访问时间 ChangeTime time.Time // 状态改变时间 Xattrs map[string]string }
五、相关参考链接
Golang 学习笔记(四)- archive/tar 实现打包压缩及解压:
2) https://broqiang.com/posts/45
如果此文对你有稍许的帮助,谢谢点赞和关注,对go语言精通之路有兴趣的可以加我qq:761774955,相互交流学习
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Flutter 完整开发实战详解(十六、详解自定义布局实战)
- 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解
- 详解Openstack环境准备
- Java泛型详解
- iOS RunLoop 详解
- Raft协议详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
打造有吸引力的学习型社群
苏平、田士杰、吕守玉 / 机械工业出版社 / 45.00元
本书首先对社群的定位、准备和吸引粉丝方面等做了饶有趣味的介绍,从社群黏度的提升、社群知识的迭代与转化和社群的持续发展等多个角度入手,对学习型社群的运营手段、运营模式、运营规律和运营经验等进行了全方位剖析。从中国培训师沙龙这个公益社群近十年成功运营的经验中,为如何经营好学习型社群总结出了一套系统性的、具有实操价值的方法。并以此为基础,扩展到知识管理、团队管理、内容IP等领域,为有致于社团建设以及优质......一起来看看 《打造有吸引力的学习型社群》 这本书的介绍吧!
MD5 加密
MD5 加密工具
HEX CMYK 转换工具
HEX CMYK 互转工具