Go語言壓縮和解壓縮tar.gz文件的方法
更新時間:2015年02月23日 15:50:36 作者:不吃皮蛋
這篇文章主要介紹了Go語言壓縮和解壓縮tar.gz文件的方法,實例分析了使用Go語言壓縮文件與解壓文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
本文實例講述了Go語言壓縮和解壓縮tar.gz文件的方法。分享給大家供大家參考。具體分析如下:
golang處理壓縮包,最常用的就是tar.gz了,這里寫了一個測試一下。
壓縮文件:
復(fù)制代碼 代碼如下:
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")
}
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")
}
解壓文件:
復(fù)制代碼 代碼如下:
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")
}
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語言程序設(shè)計有所幫助。
相關(guān)文章
vscode上搭建go開發(fā)環(huán)境詳細(xì)完整過程
這篇文章主要給大家介紹了關(guān)于vscode上搭建go開發(fā)環(huán)境的詳細(xì)完整過程,Go語言或?qū)⒊蔀樾碌闹髁﹂_發(fā)語言,Go是google開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言,所以我們有必要學(xué)習(xí)并掌握它,需要的朋友可以參考下2023-10-10go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例
這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07再次探討go實現(xiàn)無限 buffer 的 channel方法
我們知道go語言內(nèi)置的channel緩沖大小是有上限的,那么我們自己如何實現(xiàn)一個無限 buffer 的 channel呢?今天通過本文給大家分享go實現(xiàn)無限 buffer 的 channel方法,感興趣的朋友一起看看吧2021-06-06