欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Go语言压缩和解压缩tar.gz文件的方法

程序员文章站 2022-04-10 07:53:29
本文实例讲述了go语言压缩和解压缩tar.gz文件的方法。分享给大家供大家参考。具体分析如下: golang处理压缩包,最常用的就是tar.gz了,这里写了一个测试一下。...

本文实例讲述了go语言压缩和解压缩tar.gz文件的方法。分享给大家供大家参考。具体分析如下:

golang处理压缩包,最常用的就是tar.gz了,这里写了一个测试一下。

压缩文件:

复制代码 代码如下:
package main
import (
    "fmt"
    "os"
    "io"
    "archive/tar"
    "compress/gzip"
)
func main() {
    // file write
    fw, err := os.create("tar/lin_golang_src.tar.gz")
    if err != nil {
        panic(err)
    }
    defer fw.close()
    // gzip write
    gw := gzip.newwriter(fw)
    defer gw.close()
    // tar write
    tw := tar.newwriter(gw)
    defer tw.close()
    // 打开文件夹
    dir, err := os.open("file/")
    if err != nil {
        panic(nil)
    }
    defer dir.close()
    // 读取文件列表
    fis, err := dir.readdir(0)
    if err != nil {
        panic(err)
    }
    // 遍历文件列表
    for _, fi := range fis {
        // 逃过文件夹, 我这里就不递归了
        if fi.isdir() {
            continue
        }
        // 打印文件名称
        fmt.println(fi.name())
        // 打开文件
        fr, err := os.open(dir.name() + "/" + fi.name())
        if err != nil {
            panic(err)
        }
        defer fr.close()
        // 信息头
        h := new(tar.header)
        h.name = fi.name()
        h.size = fi.size()
        h.mode = int64(fi.mode())
        h.modtime = fi.modtime()
        // 写信息头
        err = tw.writeheader(h)
        if err != nil {
            panic(err)
        }
        // 写文件
        _, err = io.copy(tw, fr)
        if err != nil {
            panic(err)
        }
    }
    fmt.println("tar.gz ok")
}

解压文件:

复制代码 代码如下:
package main
import (
    "fmt"
    "os"
    "io"
    // "time"
    "archive/tar"
    "compress/gzip"
)
func main() {
    // file read
    fr, err := os.open("tar/lin_golang_src.tar.gz")
    if err != nil {
        panic(err)
    }
    defer fr.close()
    // gzip read
    gr, err := gzip.newreader(fr)
    if err != nil {
        panic(err)
    }
    defer gr.close()
    // tar read
    tr := tar.newreader(gr)
    // 读取文件
    for {
        h, err := tr.next()
        if err == io.eof {
            break
        }
        if err != nil {
            panic(err)
        }
        // 显示文件
        fmt.println(h.name)
        // 打开文件
        fw, err := os.openfile("file2/" + h.name, os.o_create | os.o_wronly, 0644/*os.filemode(h.mode)*/)
        if err != nil {
            panic(err)
        }
        defer fw.close()
        // 写文件
        _, err = io.copy(fw, tr)
        if err != nil {
            panic(err)
        }
    }
    fmt.println("un tar.gz ok")
}

这样以后打包下载东西的时候就可以使用了。

希望本文所述对大家的go语言程序设计有所帮助。