用到的包:
import (
"archive/tar"
"archive/zip"
"compress/gzip"
"io"
"io/ioutil"
"os"
"os/exec"
"runtime"
"strings"
)
1、.tar格式压缩文件解压缩
func tarDecompress(tarfile, dest string) error {
fr, err := os.Open(tarfile)
defer fr.Close()
if err != nil {
log.Error("err", err)
return err
}
tr := tar.NewReader(fr)
for {
h, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
log.Error("err", err)
return err
}
if h.FileInfo().IsDir() {
err = os.MkdirAll(dest+h.Name, os.ModePerm)
if err != nil {
log.Error("err", err)
return err
}
continue
}
fw, err := os.OpenFile(dest+h.Name, os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Error("err", err)
return err
}
defer fw.Close()
_, err = io.Copy(fw, tr)
if err != nil {
log.Error("err", err)
return err
}
}
log.Info(".tar file decompress OK!")
return nil
}
2、.tar.gz格式压缩文件解压缩
func tarGzUnzip(zipFile, dest string) error {
fr, err := os.Open(zipFile)
defer fr.Close()
if err != nil {
log.Error("err", err)
return err
}
gr, err := gzip.NewReader(fr)
defer gr.Close()
if err != nil {
log.Error("err", err)
return err
}
tr := tar.NewReader(gr)
// 读取文件
for {
h, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
log.Error("err", err)
return err
}
fw, err := os.OpenFile(dest+h.Name, os.O_CREATE|os.O_WRONLY, 0666 /*os.FileMode(h.Mode)*/)
defer fw.Close()
if err != nil {
log.Error("err", err)
return err
}
_, err = io.Copy(fw, tr)
if err != nil {
log.Error("err", err)
return err
}
}
log.Info("unzip tar.gz ok")
return nil
}
3、.zip格式压缩文件解压缩
func zipDeCompress(zipFile, dest string) error {
zr, err := zip.OpenReader(zipFile)
defer zr.Close()
if err != nil {
log.Error("err", err)
return err
}
for _, file := range zr.File {
// 如果是目录,则创建目录
if file.FileInfo().IsDir() {
err = os.MkdirAll(dest+file.Name, file.Mode())
if err != nil {
log.Error("err", err)
return err
}
continue
}
// 获取到 Reader
fr, err := file.Open()
defer fr.Close()
if err != nil {
log.Error("err", err)
return err
}
fw, err := os.OpenFile(dest+file.Name, os.O_CREATE|os.O_RDWR|os.O_TRUNC, file.Mode())
defer fw.Close()
if err != nil {
log.Error("err", err)
return err
}
_, err = io.Copy(fw, fr)
if err != nil {
log.Error("err", err)
return err
}
}
return nil
}
4、文件copy
func copyFile(src, dest string) error {
sFile, err := os.Open(src)
defer sFile.Close()
if err != nil {
log.Info("os.Open err = ", err)
return err
}
//创建目标文件
tFile, err := os.Create(dest)
defer tFile.Close()
if err != nil {
log.Info("os.Create err= ", err)
return err
}
//循环读取文件,写入目标文件中
buf := make([]byte, 4096)
for {
n, err := sFile.Read(buf)
if err != nil {
if err == io.EOF {
log.Info("文件读取完毕")
break
} else {
log.Info("sFile.Read err:", err)
return err
}
}
tFile.Write(buf[:n])
}
log.Info("copy file SUCCESS!")
return err
}