Go语言压缩和解压缩tar.gz文件的方法
程序员文章站
2022-07-05 11:11:49
本文实例讲述了go语言压缩和解压缩tar.gz文件的方法。分享给大家供大家参考。具体分析如下:
golang处理压缩包,最常用的就是tar.gz了,这里写了一个测试一下。...
本文实例讲述了go语言压缩和解压缩tar.gz文件的方法。分享给大家供大家参考。具体分析如下:
golang处理压缩包,最常用的就是tar.gz了,这里写了一个测试一下。
压缩文件:
复制代码 代码如下:
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")
}
解压文件:
复制代码 代码如下:
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语言程序设计有所帮助。