go语言官方标准库提供tar库,tar是一种打包格式,但不对文件进行压缩,所以打包后的文档一般远远大于zip和tar.gz,因为不需要压缩的原因,所以打包的速度是非常快的,打包时CPU占用率也很低。tar的目的是方便文件的管理(把分散的文件放在一个文件中),主要是通过tar.Reader读取tar包,通过tar.Writer写入tar包。
单个文件操作
1.单个文件打包(在当前目录下执行)
(1)准备要打包当前路径下的文件
(2)打包后的文件名
(3)创建一个文件,用来保存打包后的文件(qwer.tar)
(4)创建一个tar.Writer,创建后需要关闭,如果没关闭,会造成tar包不完整
(5)处理文件信息(tar包分为两部分:文件信息和文件数据
通过Stat获取FileInfo,然后通过FileInfoHeader得到tar.*Header变量名hdr
(6)将tar的文件信息hdr写入到tw( tar.Writer结构)
(7)将文件(srcFile)数据写入到tar
(8)自定义的错位打印函数
go run demo.go执行后,会生成一个qwer.tar文件
2.单个文件解包(在当前目录下执行)
以之前的qwer.tar为例,把之前的qwer源文件删了
(1)准备要解包的文件
上面是一些头部信息
(2)解包的源文件
(3)将tar包打开
(4)通过fr创建一个tar.*Reader结构,然后将tr遍历,并将数据保存到磁盘中
(5)获取文件信息
(6)创建一个空文件(qwer),用来写入解包后的数据
(7)将tr(tar包的内容)写入到fw(qwer)
(8)设置文件权限,可以保证和原始文件权限相同,如果不设置,会根据当前系统的umask来设置。
(9)关闭文件,在循环中没有使用defer关闭文件,如果想使用defer关闭文件,可以将文件写入的步骤单独封装在一个函数中即可
(10)错误提示打印函数
操作目录
tar打包整个目录,通过gzip或者bzip2压缩。打包整个目录,通过递归的方式实现。
打包及压缩目录(使用gzip压缩)
复制一个目录到当前路径下
(1)源目录名和目标目录名
(2)压缩的函数
1.创建存储压缩内容的文件
2.将tar包使用gzip压缩,在fw,和tw之前加上一层压缩
3.创建tar.writer
4.处理数据,递归处理目录及目录下的所有文件和目录,golang提供了filepath.Walk函数,需要传给他一个源文件或目录,将处理结果返回就行,只需要处理自己的打包逻辑,不需要再处理路径相关的事情。
5.通过Stat获取FileInfo(文件信息)
6.处理hdr中的name,因为默认文件的名字是不带路径的。打包之后所有文件就会堆在一起,破坏了原本的目录结果。
filepath.Separator:’/’ 去掉/是表示不是在根路径下面
7.写入文件信息
8.判断文件是否是标准文件,如果不是就不处理了,不会执行下面的步骤,直接返回nil
9.打开文件
10.copy文件数据到tw
压缩成功会生成zh-CN.tar.gz
解包解压
将压缩的过程反过来,多了创建目录的操作
解压的函数
1.打开需要解压的tar包
2.将打开的文件先解压
3.通过gr创建tar.Reader
4.在循环里面的数据写入文件
5.处理保存路径,将要保存的目录加在header中的Name
6.根据header的Typeflag字段,判断文件的类型,如果是目录就创建目录;如果是文件就写入到磁盘
7.判断目录是否存在的函数
总结
1.tar打包操作
(1)生成打包后的目标文件
(2)获取要打包的文件集
(3)往目标文件写入文件
打包原理:先创建一个文件x.tar,然后向x.tar写入tar头部信息。打开要被tar的文件,向x.tar写入头部信息,然后向x.tar写入文件信息。重复第二步直到所有文件都被写入到x.tar中,关闭x.tar,整个过程就这样完成了。
2.解包操作
(1)打开tar文件
(2)遍历tar中文
(3)创建文件,写入,保存,关闭文件
解包原理:先打开tar文件,然后从这个tar头部中循环读取存储在这个归档文件内的文件头信息,从这个文件头读取文件名,以这个文件名创建文件,然后向这个文件里写入数据。
3.压缩操作
4.解压操作