c语言文件归档,Go语言tar归档文件的读写操作

在上一节《创建 .zip 归档文件》中我们介绍了 zip 归档文件的创建和读取,那么接下来介绍一下 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 打包的实现:

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 文件,如下图所示:

bf57a96ea700a51a92647f0f34de435b.gif

图:生成的 output.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 包的文件解压到当前目录中,如下图所示:

91bb35d51c4eccd2071756944c2203aa.gif

图:解压 tar 包

至此,我们完成了对压缩和归档文件及常规文件处理的介绍。Go语言使用 io.Reader、io.ReadCloser、io.Writer 和 io.WriteCloser 等接口处理文件的方式让开发者可以使用相同的编码模式来读写文件或者其他流(如网络流或者甚至是字符串),从而大大降低了难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值