内容简介: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协议详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Numerical Methods and Methods of Approximation in Science and En
Karan Surana / CRC Press / 2018-10-31
ABOUT THIS BOOK Numerical Methods and Methods of Approximation in Science and Engineering prepares students and other readers for advanced studies involving applied numerical and computational anal......一起来看看 《Numerical Methods and Methods of Approximation in Science and En》 这本书的介绍吧!
SHA 加密
SHA 加密工具
Markdown 在线编辑器
Markdown 在线编辑器