golang中tar壓縮和解壓文件詳情
查看官方文檔,官方自帶的演示:
// 官方演示
package main
import (
"archive/tar"
"bytes"
"fmt"
"io"
"log"
"os"
)
func main() {
// 將若干文件寫入壓縮文檔
// 這邊源文件是直接寫在代碼里哈,然后也沒有輸出一個(gè)文檔
// 后面會(huì)演示源文件進(jìn)行壓縮,然后輸出一個(gè)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)容都存儲(chǔ)在buf這個(gè)變量里
// 這邊遍歷輸出一下即可
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)常會(huì)用到。這邊可用os庫(kù)中的文件操作,將壓縮內(nèi)容寫入文檔,參考
代碼如下:
// tar壓縮
// 這邊演示一下從源文件進(jìn)行壓縮,然后輸出一個(gè)tar.gz文檔
// 作者:陳杰斌
// 參考地址:http://www.01happy.com/golang-tar/
package main
import (
"archive/tar"
"bytes"
"log"
"os"
)
func main() {
// 創(chuàng)建一個(gè)緩沖區(qū)用來(lái)保存壓縮文件內(nèi)容
var buf bytes.Buffer
// 創(chuàng)建一個(gè)壓縮文檔
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庫(kù)將文檔內(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方法, 這個(gè)方法接收一個(gè)io.Reader對(duì)象
// 那邊怎么從源文件得到io.Reader對(duì)象呢?
// 這邊通過(guò)os.Open打開文件,會(huì)得到一個(gè)os.File對(duì)象,
// 因?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對(duì)象讀取文件內(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang詳細(xì)講解常用Http庫(kù)及Gin框架的應(yīng)用
下面這篇文章主要給大家介紹了關(guān)于Golang常用的Http庫(kù)及Gin框架,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
使用Go+GoQuery庫(kù)實(shí)現(xiàn)頭條新聞采集
在本文中,我們將介紹如何使用Go語(yǔ)言和GoQuery庫(kù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬蟲程序,用于抓取頭條新聞的網(wǎng)頁(yè)內(nèi)容,我們還將使用爬蟲代理服務(wù),提高爬蟲程序的性能和安全性,我們將使用多線程技術(shù),提高采集效率,最后,我們將展示爬蟲程序的運(yùn)行結(jié)果和代碼,需要的朋友可以參考下2023-10-10
Golang Socket Server自定義協(xié)議的簡(jiǎn)單實(shí)現(xiàn)方案
這篇文章主要介紹了Golang Socket Server自定義協(xié)議的簡(jiǎn)單實(shí)現(xiàn)方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go語(yǔ)言規(guī)范context?類型的key用法示例解析
這篇文章主要為大家介紹了Go語(yǔ)言規(guī)范context?類型的key用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

