GO:zip、tar、tar.gz格式文件解压缩

用到的包:

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
}

 

你可能感兴趣的:(Go)