您现在的位置是:群英 > 开发技术 > 编程语言
Golang中tar怎样实现解压和压缩文件的
Admin发表于 2022-07-07 17:32:01862 次浏览
这篇文章给大家介绍了“Golang中tar怎样实现解压和压缩文件的”的相关知识,讲解详细,步骤过程清晰,对大家进一步学习和理解“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怎样实现解压和压缩文件的”的文章就介绍到这了,感谢各位的阅读,更多相关Golang中tar怎样实现解压和压缩文件的内容,欢迎关注群英网络资讯频道,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: Golang
相关信息推荐
2022-09-24 17:13:20 
摘要:这篇文章通过实例代码介绍了PHP实现JWT的Token登录认证的方式,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-05-17 11:45:49 
摘要:h5:本文为大家介绍了html5嵌入视频的方法,具有一定的参考价值,希望可以帮助到大家。
2021-12-28 18:56:56 
摘要:这篇文章给大家分享的是关于Python中运算符号的内容,Python中运算符号有很多,下文主要介绍一下基础的运算符号及其基础的使用方法,对新手学习Python中运算符号有帮助,学习的过的朋友也了解看看,本文的汇总比较全面,对大家复习Python中运算符号的内容也有帮助,那么感兴趣的朋友接下来一起跟随小编看看吧。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部