golang中tar壓縮和解壓文件詳情
查看官方文檔,官方自帶的演示:
// 官方演示 package main import ( "archive/tar" "bytes" "fmt" "io" "log" "os" ) func main() { // 將若干文件寫入壓縮文檔 // 這邊源文件是直接寫在代碼里哈,然后也沒有輸出一個文檔 // 后面會演示源文件進(jìn)行壓縮,然后輸出一個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) } // 上面壓縮了之后,壓縮內(nèi)容都存儲在buf這個變量里 // 這邊遍歷輸出一下即可 tr := tar.NewReader(&buf) for { hdr, err := tr.Next() if err == io.EOF { break // 文件已經(jīng)遍歷完成了 } if err != nil { log.Fatal(err) } fmt.Printf("%s的文件內(nèi)容: ", hdr.Name) if _, err := io.Copy(os.Stdout, tr); err != nil { log.Fatal(err) } fmt.Println() } }
1、壓縮并輸出tar.gz文檔
官方的演示中并未將壓縮的內(nèi)容輸出文檔,實(shí)際使用中經(jīng)常會用到。這邊可用os庫中的文件操作,將壓縮內(nèi)容寫入文檔,參考
代碼如下:
// tar壓縮 // 這邊演示一下從源文件進(jìn)行壓縮,然后輸出一個tar.gz文檔 // 作者:陳杰斌 // 參考地址:http://www.01happy.com/golang-tar/ package main import ( "archive/tar" "bytes" "log" "os" ) func main() { // 創(chuàng)建一個緩沖區(qū)用來保存壓縮文件內(nèi)容 var buf bytes.Buffer // 創(chuàng)建一個壓縮文檔 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) } // 將壓縮文檔內(nèi)容寫入文件 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) }
執(zhí)行一下哈:
> go run compress.go
golang中tar壓縮:
2、tar解壓縮
同上,可以使用os
庫將文檔內(nèi)容讀入
// tar解壓縮演示 // 這邊演示一下從源文件進(jìn)行解壓,然后輸出文件內(nèi)容 // 作者:陳杰斌 // 參考地址: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對象, // 因?yàn)樗麑?shí)現(xiàn)了io.Reader的Read方法,所有可以直接傳遞給tar.NewReader file, err := os.Open("file.tar.gz") if err != nil { log.Fatalln(err) } defer file.Close() // tar對象讀取文件內(nèi)容, 遍歷輸出文件內(nèi)容 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èi)容:\n", hdr.Name) if _, err := io.Copy(os.Stdout, tr); err != nil { log.Fatal(err) } fmt.Println() } }
執(zhí)行一下:
> go run decompress.go
golang中tar解壓:
到此這篇關(guān)于golang中tar壓縮和解壓文件詳情的文章就介紹到這了,更多相關(guān)golang中tar壓縮和解壓文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入理解Golang?Channel?的底層結(jié)構(gòu)
這篇文章主要介紹了深入理解Golang?Channel?的底層結(jié)構(gòu),Go?語言的?channel?底層是什么數(shù)據(jù)結(jié)構(gòu)?下面我們就一起來深入解析一下?channel,需要的朋友可以參考下2022-01-01簡化Go開發(fā)提高生產(chǎn)力的強(qiáng)大工具及使用詳解
作為?Go?開發(fā)人員,應(yīng)該都知道維持簡潔高效開發(fā)工作流程的重要性,為了提高工作效率和代碼質(zhì)量,簡化開發(fā)流程并自動執(zhí)行重復(fù)性任務(wù)至關(guān)重要,在本文中,我們將探討一些強(qiáng)大的工具和技術(shù),它們將簡化?Go?開發(fā)過程,助力您的編碼之旅2023-10-10VsCode搭建Go語言開發(fā)環(huán)境的配置教程
這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05jenkins構(gòu)建go及java項(xiàng)目的方法
這篇文章主要介紹了jenkins構(gòu)建go及java項(xiàng)目,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值了,需要的朋友可以參考下2021-04-04深入了解Go的interface{}底層原理實(shí)現(xiàn)
本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06golang channel讀取數(shù)據(jù)的幾種情況
本文主要介紹了golang channel讀取數(shù)據(jù)的幾種情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02