目录
  • 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压缩和解压文件详情的文章就介绍到这了,更多相关golang中tar压缩和解压文件内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!