文件压缩的一种实现

338 阅读1分钟

记录一下对文件进行压缩的实现,这里只列出了核心代码

/*
函数名:	makeTarGzip
		制作压缩包,提高在线传输速率
参 数:
		encFile , 		密文文件
		signFile ,		签名文件
返回值:
		压缩后文件名
		错误信息
创建时间及创建者:
		2021-06-15	Yuan_sr
*/
func makeTarGzip(encFile, signFile string) (string, error){
	tarGzipFileName =   "example.tar.gz"
    
	// file write
	fw, err := os.Create(tarGzipFileName)
	if err != nil {
		return "", 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("./")
	if err != nil {
		return "", err
	}
	defer dir.Close()

	// 读取文件列表
	fis, err := dir.Readdir(0)
	if err != nil {
		return "", err
	}
	for _, fi := range fis{
		if fi.IsDir(){
			continue
		}
		if fi.Name() == encFile || fi.Name() == signFile{ //去掉这个条件可以实现该目录下所有文件的压缩
			ef, err := os.Open(dir.Name() + "/" + fi.Name())
			if err != nil {
				return "", err
			}
			defer ef.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 {
				return "", err
			}
			_, err = io.Copy(tw, ef)
			if err != nil {
				return "", err
			}
		}
	}
	return tarGzipFileName, err
}

/*
函数名:	unTarGzip
		文件解压缩
参 数:
		tarGzipFile , 	待解压缩文件
返回值:
		错误信息
创建时间及创建者:
		2021-06-15	Yuan_sr
*/
func unTarGzip (tarGzipFile string) error {
	fr, err := os.Open(tarGzipFile)
	if err != nil {
		return err
	}
	defer fr.Close()
	gr, err := gzip.NewReader(fr)
	if err != nil {
		return err
	}
	defer gr.Close()
	tr := tar.NewReader(gr)

	for {
		h, err := tr.Next()
		if err == io.EOF {
			break
		}
		if err != nil {
			return  err
		}
		fw, err := os.OpenFile(h.Name, os.O_CREATE | os.O_WRONLY, 0755)
		if err != nil {
			return err
		}
		defer fw.Close()

		_, err = io.Copy(fw, tr)
		if err != nil {
			return err
		}
	}
	return nil
}