Go语言tar归档文件的读写操作
创建 tar 归档文件
tar 是一种打包格式,但不对文件进行压缩,所以打包后的文档一般远远大于 zip 和 tar.gz,因为不需要压缩的原因,所以打包的速度是非常快的,打包时 CPU 占用率也很低。tar 的目的在于方便文件的管理,比如在我们的生活中,有很多小物品分散在房间的各个角落,为了方便整洁可以将这些零散的物品整理进一个箱子中,而 tar 的功能就类似这样。
创建 tar 归档文件与创建 .zip 归档文件非常类似,主要不同点在于我们将所有数据都写入相同的 writer 中,并且在写入文件的数据之前必须写入完整的头部,而非仅仅是一个文件名。
tar 打包实现原理如下:
创建一个文件 x.tar,然后向 x.tar 写入 tar 头部信息;
打开要被 tar 的文件,向 x.tar 写入头部信息,然后向 x.tar 写入文件信息;
当有多个文件需要被 tar 时,重复第二步直到所有文件都被写入到 x.tar 中;
关闭 x.tar,完成打包。
下面通过示例程序简单演示一下Go语言 tar 打包的实现:
运行上面的代码会在当前目录下生成一个 output.tar 文件,如下图所示:package main
import (
"archive/tar"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Create("./output.tar") //创建一个 tar 文件
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
tw := tar.NewWriter(f)
defer tw.Close()
fileinfo, err := os.Stat("./main.exe") //获取文件相关信息
if err != nil {
fmt.Println(err)
}
hdr, err := tar.FileInfoHeader(fileinfo, "")
if err != nil {
fmt.Println(err)
}
err = tw.WriteHeader(hdr) //写入头文件信息
if err != nil {
fmt.Println(err)
}
f1, err := os.Open("./main.exe")
if err != nil {
fmt.Println(err)
return
}
m, err := io.Copy(tw, f1) //将main.exe文件中的信息写入压缩包中
if err != nil {
fmt.Println(err)
}
fmt.Println(m)
}

图:生成的 output.tar 文件
解压 tar 归档文件
解压 tar 归档文件比创建 tar 归档文档稍微简单些。首先需要将其打开,然后从这个 tar 头部中循环读取存储在这个归档文件内的文件头信息,从这个文件头里读取文件名,以这个文件名创建文件,然后向这个文件里写入数据即可。示例代码如下所示:
运行上面的程序会将 tar 包的文件解压到当前目录中,如下图所示:package main
import (
"archive/tar"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("output.tar")
if err != nil {
fmt.Println("文件打开失败", err)
return
}
defer f.Close()
r := tar.NewReader(f)
for hdr, err := r.Next(); err != io.EOF; hdr, err = r.Next() {
if err != nil {
fmt.Println(err)
return
}
fileinfo := hdr.FileInfo()
fmt.Println(fileinfo.Name())
f, err := os.Create("123" + fileinfo.Name())
if err != nil {
fmt.Println(err)
}
defer f.Close()
_, err = io.Copy(f, r)
if err != nil {
fmt.Println(err)
}
}
}

图:解压 tar 包
此,我们完成了对压缩和归档文件及常规文件处理的介绍。Go语言使用 io.Reader、io.ReadCloser、io.Writer 和 io.WriteCloser 等接口处理文件的方式让开发者可以使用相同的编码模式来读写文件或者其他流(如网络流或者甚是字符串),从而大大降低了难度。
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 风儿(风儿轻轻的吹)
- 饿了么红包怎么用(饿了么红包怎么用微信支付)
- 光遇花手先祖位置(安卓光遇手花先祖)
- 广州4a广告公司(广州4a广告公司创意总监年薪)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 冰客(冰客果汁)
- yy魔兽(yy魔兽世界)
- 拆奶罩
- 郭妮小说(恶魔的法则郭妮小说)
- 东天目山(东天目山景区)
- 杭同(杭同培训中心怎么样)
- 大松电饭煲(美的大松电饭煲)
- 服饰加盟(服饰加盟店招商)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 骇客神条(骇客神条怎么辨别真假)
- 广州晓港公园(广州晓港公园正门图片)
- 钢筋等级符号(钢筋等级符号电脑怎么输入)
