golang中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壓縮和解壓文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: