golang中tar压缩和解压文件详情
作者:快乐编程 发布时间:2024-05-10 13:58:46
标签:golang,tar,压缩,解压文件
目录
1、压缩并输出tar.gz文档
2、tar解压缩
查看官方文档,官方自带的演示:
// 官方演示
package main
import (
"archive/tar"
"bytes"
"fmt"
"io"
"log"
"os"
)
func main() {
// 将若干文件写入压缩文档
// 这边源文件是直接写在代码里哈,然后也没有输出一个文档
// 后面会演示源文件进行压缩,然后输出一个tar.gz的压缩文档
var buf bytes.Buffer
tw := tar.NewWriter(&buf)
var files = []struct {
Name, Body string
}{
{"readme.txt", "This archive contains some text files."},
{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
{"todo.txt", "Get animal handling license."},
}
for _, file := range files {
hdr := &tar.Header{
Name: file.Name,
Mode: 0600,
Size: int64(len(file.Body)),
}
if err := tw.WriteHeader(hdr); err != nil {
log.Fatal(err)
}
if _, err := tw.Write([]byte(file.Body)); err != nil {
log.Fatal(err)
}
}
if err := tw.Close(); err != nil {
log.Fatal(err)
}
// 上面压缩了之后,压缩内容都存储在buf这个变量里
// 这边遍历输出一下即可
tr := tar.NewReader(&buf)
for {
hdr, err := tr.Next()
if err == io.EOF {
break // 文件已经遍历完成了
}
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s的文件内容: ", hdr.Name)
if _, err := io.Copy(os.Stdout, tr); err != nil {
log.Fatal(err)
}
fmt.Println()
}
}
1、压缩并输出tar.gz文档
官方的演示中并未将压缩的内容输出文档,实际使用中经常会用到。这边可用os库中的文件操作,将压缩内容写入文档,参考
代码如下:
// tar压缩
// 这边演示一下从源文件进行压缩,然后输出一个tar.gz文档
// 作者:陈杰斌
// 参考地址:http://www.01happy.com/golang-tar/
package main
import (
"archive/tar"
"bytes"
"log"
"os"
)
func main() {
// 创建一个缓冲区用来保存压缩文件内容
var buf bytes.Buffer
// 创建一个压缩文档
tw := tar.NewWriter(&buf)
// 定义一堆文件
// 将文件写入到压缩文档tw
var files = []struct {
Name, Body string
}{
{"readme.txt", "This archive contains some text files."},
{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
{"todo.txt", "Get animal handling license."},
}
for _, file := range files {
hdr := &tar.Header{
Name: file.Name,
Mode: 0600,
Size: int64(len(file.Body)),
}
if err := tw.WriteHeader(hdr); err != nil {
log.Fatal(err)
}
if _, err := tw.Write([]byte(file.Body)); err != nil {
log.Fatal(err)
}
}
if err := tw.Close(); err != nil {
log.Fatal(err)
}
// 将压缩文档内容写入文件 file.tar.gz
f, err := os.OpenFile("file.tar.gz", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatal(err)
}
buf.WriteTo(f)
}
执行一下哈:
> go run compress.go
golang中tar压缩:
2、tar解压缩
同上,可以使用os
库将文档内容读入
// tar解压缩演示
// 这边演示一下从源文件进行解压,然后输出文件内容
// 作者:陈杰斌
// 参考地址:http://www.01happy.com/golang-tar/
package main
import (
"archive/tar"
"fmt"
"io"
"log"
"os"
)
func main() {
// 解压需要使用tar.NewReader方法, 这个方法接收一个io.Reader对象
// 那边怎么从源文件得到io.Reader对象呢?
// 这边通过os.Open打开文件,会得到一个os.File对象,
// 因为他实现了io.Reader的Read方法,所有可以直接传递给tar.NewReader
file, err := os.Open("file.tar.gz")
if err != nil {
log.Fatalln(err)
}
defer file.Close()
// tar对象读取文件内容, 遍历输出文件内容
tr := tar.NewReader(file)
for {
hdr, err := tr.Next()
if err == io.EOF {
break // End of archive
}
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s文件内容:\n", hdr.Name)
if _, err := io.Copy(os.Stdout, tr); err != nil {
log.Fatal(err)
}
fmt.Println()
}
}
执行一下:
> go run decompress.go
golang中tar解压:
来源:104.116.116.112.58.47.47.119.119.119.46.48.49.104.97.112.112.121.46.99.111.109.47.103.111.108.97.110.103.45.116.97.114.47.


猜你喜欢
- 1、加字段:alter table 表名 ADD 字段名 类型;eg:alter table sys_cwzd ADD SCCLLJ VAR
- 本文实例讲述了PHP函数按引用传递参数及函数可选参数用法。分享给大家供大家参考,具体如下:一、函数按引用传递参数1. 代码<!DOCT
- 一、简介我们在这里采用Python中的matplotlib来实现曲线图形的绘制。matplotlib是著名的python绘图库,它提供了一整
- sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符。命令总解:update 表的名称 set 此表要替
- =一、链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一
- 利用PHP中的thinkphp5进行项目开发,将view一道项目跟目录下进入到/www/wwwroot/xxxx/application/c
- 蜜蜂可以看到紫外线,人则看不到;蛇和蚊子可以看到红外线,人则看不到。火狐(Firefox)浏览器也可以看到人们看不到的东西,但迄今为止,这些
- 有时候,我们可能想在django中写一些代码来测试某些功能,我们希望在django项目中单独运行某个python文件来做这项测试工作。但是如
- 我们都知道在Web开发中,都需要服务器,比如Java Web开发的Tomcat,WebLogic,WebSphere,现在来看利用Torna
- 1. 问题截图:(8000端口被占用)2. 第一种是可能会打开了多个运行窗口右键关闭即可:3. 第二种是在你运行python的主机上查询出p
- var obj=document.getElementById("id");得到的是dom对象,对该对象进行操作的时候使
- 本文说明向外扩展数据库系统的两个选项,从而实现更高的可扩展性:水平数据划分和垂直数据划分当我提到向外扩展数据库系统时,我实际上只是讨论对数据
- 本文实例讲述了Python记录详细调用堆栈日志的方法。分享给大家供大家参考。具体实现方法如下:import sysimport osdef
- YAML语法规则:http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/下载PyY
- 问题:python 在调用dll 的时候出现了精度问题总结:使用decimal库进行转换就可以正常传递。遇到的问题具体情况dll 生成函数代
- 如今大部分网站仍然采用表格嵌套内容的方式来制作网站,虽然此方法对于我们来说比较熟悉、比较上手;但是,它却阻碍了一种更好的、更有亲和力的、更灵
- Dreamweaver MX 2004的强大功能以及更加完善的人性化设置已经深受大家喜爱。在此笔者就谈
- 关于窗口函数的基础,请看文章SQL窗口函数许多常见的聚合函数也可以作为窗口函数使用,包括AVG()、SUM()、COUNT()、MAX()以
- 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysda
- 前文学习:python数据类型: python数据结构:数据类型.python的输入输出: python数据结构输入输出及控制和异常.pyt