golang打包、解包、压缩、解压操作

go语言官方标准库提供tar库,tar是一种打包格式,但不对文件进行压缩,所以打包后的文档一般远远大于zip和tar.gz,因为不需要压缩的原因,所以打包的速度是非常快的,打包时CPU占用率也很低。tar的目的是方便文件的管理(把分散的文件放在一个文件中),主要是通过tar.Reader读取tar包,通过tar.Writer写入tar包。

单个文件操作

1.单个文件打包(在当前目录下执行)

golang打包、解包、压缩、解压操作_第1张图片

(1)准备要打包当前路径下的文件
golang打包、解包、压缩、解压操作_第2张图片
(2)打包后的文件名
在这里插入图片描述
(3)创建一个文件,用来保存打包后的文件(qwer.tar)
golang打包、解包、压缩、解压操作_第3张图片
(4)创建一个tar.Writer,创建后需要关闭,如果没关闭,会造成tar包不完整
golang打包、解包、压缩、解压操作_第4张图片
(5)处理文件信息(tar包分为两部分:文件信息和文件数据
通过Stat获取FileInfo,然后通过FileInfoHeader得到tar.*Header变量名hdr
在这里插入图片描述
在这里插入图片描述
(6)将tar的文件信息hdr写入到tw( tar.Writer结构)
在这里插入图片描述
(7)将文件(srcFile)数据写入到tar
golang打包、解包、压缩、解压操作_第5张图片
(8)自定义的错位打印函数
在这里插入图片描述
go run demo.go执行后,会生成一个qwer.tar文件
golang打包、解包、压缩、解压操作_第6张图片

2.单个文件解包(在当前目录下执行)

golang打包、解包、压缩、解压操作_第7张图片

以之前的qwer.tar为例,把之前的qwer源文件删了
(1)准备要解包的文件
上面是一些头部信息
golang打包、解包、压缩、解压操作_第8张图片
golang打包、解包、压缩、解压操作_第9张图片
(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压缩)

golang打包、解包、压缩、解压操作_第10张图片

复制一个目录到当前路径下
(1)源目录名和目标目录名
在这里插入图片描述
golang打包、解包、压缩、解压操作_第11张图片
(2)压缩的函数
1.创建存储压缩内容的文件
golang打包、解包、压缩、解压操作_第12张图片
2.将tar包使用gzip压缩,在fw,和tw之前加上一层压缩
在这里插入图片描述
3.创建tar.writer
在这里插入图片描述
4.处理数据,递归处理目录及目录下的所有文件和目录,golang提供了filepath.Walk函数,需要传给他一个源文件或目录,将处理结果返回就行,只需要处理自己的打包逻辑,不需要再处理路径相关的事情。
在这里插入图片描述
5.通过Stat获取FileInfo(文件信息)
在这里插入图片描述
6.处理hdr中的name,因为默认文件的名字是不带路径的。打包之后所有文件就会堆在一起,破坏了原本的目录结果。
filepath.Separator:’/’ 去掉/是表示不是在根路径下面
在这里插入图片描述
golang打包、解包、压缩、解压操作_第13张图片

7.写入文件信息
在这里插入图片描述
8.判断文件是否是标准文件,如果不是就不处理了,不会执行下面的步骤,直接返回nil
在这里插入图片描述
9.打开文件
golang打包、解包、压缩、解压操作_第14张图片
10.copy文件数据到tw
在这里插入图片描述
压缩成功会生成zh-CN.tar.gz
在这里插入图片描述

解包解压

将压缩的过程反过来,多了创建目录的操作
golang打包、解包、压缩、解压操作_第15张图片
解压的函数
1.打开需要解压的tar包
在这里插入图片描述
2.将打开的文件先解压
在这里插入图片描述
3.通过gr创建tar.Reader
在这里插入图片描述
4.在循环里面的数据写入文件
golang打包、解包、压缩、解压操作_第16张图片
5.处理保存路径,将要保存的目录加在header中的Name
在这里插入图片描述
6.根据header的Typeflag字段,判断文件的类型,如果是目录就创建目录;如果是文件就写入到磁盘
golang打包、解包、压缩、解压操作_第17张图片
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.解压操作

你可能感兴趣的:(GO)