From 7ce84b3d1e45d35c7c9f73561893039a05c16995 Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期五, 20 十二月 2019 19:38:18 +0800
Subject: [PATCH] fix unTargz

---
 extend/util/zip.go    |  314 ++++++++++++++++++++++++++++++++++++++++++++
 extend/util/util.go   |  103 --------------
 service/SysService.go |    2 
 3 files changed, 315 insertions(+), 104 deletions(-)

diff --git a/extend/util/util.go b/extend/util/util.go
index fb6623e..89fc165 100644
--- a/extend/util/util.go
+++ b/extend/util/util.go
@@ -1,11 +1,8 @@
 package util
 
 import (
-	"archive/tar"
 	"archive/zip"
-	"basic.com/valib/logger.git"
 	"bytes"
-	"compress/gzip"
 	"crypto/md5"
 	"encoding/hex"
 	"encoding/json"
@@ -301,106 +298,6 @@
 	}
 
 	return nil
-}
-
-//鍘嬬缉 浣跨敤gzip鍘嬬缉鎴恡ar.gz
-func TarCompress(files []*os.File, dest string) error {
-	d, _ := os.Create(dest)
-	defer d.Close()
-	gw := gzip.NewWriter(d)
-	defer gw.Close()
-	tw := tar.NewWriter(gw)
-	defer tw.Close()
-	for _, file := range files {
-		err := gzipCompress(file, "", tw)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func gzipCompress(file *os.File, prefix string, tw *tar.Writer) error {
-	info, err := file.Stat()
-	if err != nil {
-		return err
-	}
-	if info.IsDir() {
-		prefix = prefix + "/" + info.Name()
-		fileInfos, err := file.Readdir(-1)
-		if err != nil {
-			return err
-		}
-		for _, fi := range fileInfos {
-			f, err := os.Open(file.Name() + "/" + fi.Name())
-			if err != nil {
-				return err
-			}
-			err = gzipCompress(f, prefix, tw)
-			if err != nil {
-				return err
-			}
-		}
-	} else {
-		header, err := tar.FileInfoHeader(info, "")
-		header.Name = prefix + "/" + header.Name
-		if err != nil {
-			return err
-		}
-		err = tw.WriteHeader(header)
-		if err != nil {
-			return err
-		}
-		_, err = io.Copy(tw, file)
-		file.Close()
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-//瑙e帇 tar.gz
-func DeCompress(tarFile, dest string) error {
-	srcFile, err := os.Open(tarFile)
-	if err != nil {
-		logger.Debug("open tarFile err:",err)
-		return err
-	}
-	defer srcFile.Close()
-	gr, err := gzip.NewReader(srcFile)
-	if err != nil {
-		logger.Debug("gzip.NewReader err:",err)
-		return err
-	}
-	defer gr.Close()
-	tr := tar.NewReader(gr)
-	for {
-		hdr, err := tr.Next()
-		if err != nil {
-			if err == io.EOF {
-				break
-			} else {
-				return err
-			}
-		}
-		filename := dest + hdr.Name
-		file, err := createFile(filename)
-		if err != nil {
-			logger.Debug("createFile err:",err)
-			return err
-		}
-		io.Copy(file, tr)
-	}
-	return nil
-}
-
-func createFile(name string) (*os.File, error) {
-	err := os.MkdirAll(string([]rune(name)[0:strings.LastIndex(name, "/")]), 0755)
-	if err != nil {
-		return nil, err
-	}
-	return os.Create(name)
 }
 
 func FormatNum(oNum int,n int) string {
diff --git a/extend/util/zip.go b/extend/util/zip.go
new file mode 100644
index 0000000..cb44ee3
--- /dev/null
+++ b/extend/util/zip.go
@@ -0,0 +1,314 @@
+package util
+
+import (
+	"archive/tar"
+	"basic.com/valib/logger.git"
+	"compress/gzip"
+	"errors"
+	"io"
+	"io/ioutil"
+	"os"
+	"path"
+	"strings"
+)
+
+//FileName 寰呭帇缂╃殑鏂囦欢鍚�
+//DesPathName 鍘嬬缉瀹屼箣鍚庡瓨鏀剧殑鐩綍鍚�
+func Gzip(FilePathName, DesPathName string) error {
+	// 娓呯悊璺緞瀛楃涓�
+	FilePathName = path.Clean(FilePathName)
+	// 瑕佽В鍘嬬殑鏂囦欢鍚嶅瓧
+	FileName := FilePathName
+	index := strings.LastIndex(FilePathName, "\\")
+	if index != -1 {
+		FileName = FilePathName[index+1:]
+	}
+	logger.Debug("鏂囦欢鍚嶇О鏄�", FileName)
+	//鍒涘缓瀛樻斁鍘嬬缉鏂囦欢鐨勮矾寰�(濡傛灉鏂囦欢澶逛笉瀛樺湪)
+
+	if !dirExists(DesPathName) {
+		os.MkdirAll(DesPathName, 0777)
+	}
+	logger.Debug("鍒涘缓鏂囦欢")
+	//鍒涘缓鍘嬬缉鏂囦欢
+	DesFileName := DesPathName + "\\" + FileName + ".gz"
+	fw, er := os.Create(DesFileName)
+	if er != nil {
+		return er
+	}
+	defer fw.Close()
+	gw := gzip.NewWriter(fw)
+	defer gw.Close()
+
+	//璇诲彇鏂囦欢鍐呭
+	rd := make([]byte, 1024*1024)
+	rd, err := ioutil.ReadFile(FilePathName)
+	if err != nil {
+		logger.Debug("璇诲彇鏂囦欢鍐呯殑鏁版嵁鍑洪敊 err:", err)
+		return err
+	}
+	// 鑾峰彇鏂囦欢鎴栫洰褰曚俊鎭�
+	fi, err := os.Stat(FilePathName)
+	if err != nil {
+		logger.Debug("鑾峰彇鏂囦欢鐨勮缁嗕俊鎭嚭閿� err :", err)
+		return nil
+	}
+	gw.Name = fi.Name()
+	gw.ModTime = fi.ModTime()
+	_, err = gw.Write(rd)
+	if err != nil {
+		logger.Debug("鍐欏叆鍘嬬缉鏂囦欢鍑洪敊 err:", err)
+		return err
+	}
+	err = gw.Flush()
+	if err != nil {
+		logger.Debug("gw.Flush() 鍑洪敊 err:", err)
+		return err
+	}
+	return nil
+}
+func UnGz(srcGz string, filePath string) error {
+	fr, err := os.Open(srcGz)
+	if err != nil {
+		logger.Debug("open secGZ failed. err:%v", err)
+		return err
+	}
+	gr, err := gzip.NewReader(fr)
+	if err != nil {
+		fr.Close()
+		logger.Debug("create gzip.reader failed. err:%v", err)
+		return err
+	}
+	index := strings.LastIndex(srcGz, ".")
+	if index == -1 {
+		gr.Close()
+		fr.Close()
+		logger.Debug("find . failed. err:%v", err)
+		return err
+	}
+	fw, err := os.Create(filePath)
+	if err != nil {
+		gr.Close()
+		fr.Close()
+		logger.Debug("create file failed. err:%v", err)
+		return err
+	}
+	// 鍐欐枃浠�
+	_, err = io.Copy(fw, gr)
+	if err != nil {
+		fw.Close()
+		gr.Close()
+		fr.Close()
+		logger.Debug("write file failed. err:%v", err)
+		return err
+	}
+	fw.Close()
+	gr.Close()
+	fr.Close()
+	//鍒犻櫎gz鍘嬬缉鏂囦欢
+	err = os.Remove(srcGz)
+	if err != nil {
+		logger.Debug("remove file failed. err:%v", err)
+		return err
+	}
+	return nil
+}
+// 灏嗘枃浠舵垨鐩綍鎵撳寘鎴� .tar 鏂囦欢
+// src 鏄鎵撳寘鐨勬枃浠舵垨鐩綍鐨勮矾寰�
+// dstTar 鏄鐢熸垚鐨� .tar 鏂囦欢鐨勮矾寰�
+// failIfExiBst 鏍囪濡傛灉 dstTar 鏂囦欢瀛樺湪锛屾槸鍚︽斁寮冩墦鍖咃紝濡傛灉鍚︼紝鍒欎細瑕嗙洊宸插瓨鍦ㄧ殑鏂囦欢
+func TarGz(src string, dstTar string, failIfExist bool) error {
+	// 娓呯悊璺緞瀛楃涓�
+	src = path.Clean(src)
+	// 鍒ゆ柇瑕佹墦鍖呯殑鏂囦欢鎴栫洰褰曟槸鍚﹀瓨鍦�
+	if !exists(src) {
+		return errors.New("瑕佹墦鍖呯殑鏂囦欢鎴栫洰褰曚笉瀛樺湪锛�" + src)
+	}
+	// 鍒ゆ柇鐩爣鏂囦欢鏄惁瀛樺湪
+	if fileExists(dstTar) {
+		if failIfExist { // 涓嶈鐩栧凡瀛樺湪鐨勬枃浠�
+			return errors.New("鐩爣鏂囦欢宸茬粡瀛樺湪锛�" + dstTar)
+		} else { // 瑕嗙洊宸插瓨鍦ㄧ殑鏂囦欢
+			if er := os.Remove(dstTar); er != nil {
+				return er
+			}
+		}
+	}
+	// 鍒涘缓绌虹殑鐩爣鏂囦欢
+	fw, er := os.Create(dstTar)
+	if er != nil {
+		return er
+	}
+	defer fw.Close()
+	gw := gzip.NewWriter(fw)
+	defer gw.Close()
+	// 鍒涘缓 tar.Writer锛屾墽琛屾墦鍖呮搷浣�
+	tw := tar.NewWriter(gw)
+	var err error
+	defer func() {
+		// 杩欓噷瑕佸垽鏂� tw 鏄惁鍏抽棴鎴愬姛锛屽鏋滃叧闂け璐ワ紝鍒� .tar 鏂囦欢鍙兘涓嶅畬鏁�
+		if er := tw.Close(); er != nil {
+			err = er
+		}
+	}()
+	// 鑾峰彇鏂囦欢鎴栫洰褰曚俊鎭�
+	fi, er := os.Stat(src)
+	if er != nil {
+		return er
+	}
+	// 鑾峰彇瑕佹墦鍖呯殑鏂囦欢鎴栫洰褰曠殑鎵�鍦ㄤ綅缃拰鍚嶇О
+	srcBase, srcRelative := path.Split(path.Clean(src))
+	// 寮�濮嬫墦鍖�
+	if fi.IsDir() {
+		logger.Debug("绗竴灞傜洰褰曪細", srcRelative)
+		tarDir(srcBase, srcRelative, tw, fi)
+	} else {
+		tarFile(srcBase, srcRelative, tw, fi)
+	}
+	return nil
+}
+// 鍥犱负瑕佹墽琛岄亶鍘嗘搷浣滐紝鎵�浠ヨ鍗曠嫭鍒涘缓涓�涓嚱鏁�
+func tarDir(srcBase, srcRelative string, tw *tar.Writer, fi os.FileInfo) (err error) {
+	// 鑾峰彇瀹屾暣璺緞
+	srcFull := srcBase + srcRelative
+	logger.Debug("srcFull:", srcFull)
+	// 鍦ㄧ粨灏炬坊鍔� "/"
+	last := len(srcRelative) - 1
+	if srcRelative[last] != os.PathSeparator {
+		srcRelative += string(os.PathSeparator)
+	}
+	// 鑾峰彇 srcFull 涓嬬殑鏂囦欢鎴栧瓙鐩綍鍒楄〃
+	fis, er := ioutil.ReadDir(srcFull)
+	if er != nil {
+		return er
+	}
+	// 寮�濮嬮亶鍘�
+	for _, fi := range fis {
+		if fi.IsDir() {
+			logger.Debug("涓嬪眰鐩綍")
+			tarDir(srcBase, srcRelative+fi.Name(), tw, fi)
+		} else {
+			logger.Debug("鏄枃浠�")
+			tarFile(srcBase, srcRelative+fi.Name(), tw, fi)
+		}
+	}
+	return nil
+}
+// 鍥犱负瑕佸湪 defer 涓叧闂枃浠讹紝鎵�浠ヨ鍗曠嫭鍒涘缓涓�涓嚱鏁�
+func tarFile(srcBase, srcRelative string, tw *tar.Writer, fi os.FileInfo) (err error) {
+	// 鑾峰彇瀹屾暣璺緞
+	srcFull := srcBase + srcRelative
+	logger.Debug("鏂囦欢鐨勫叏璺緞", srcFull)
+	// 鍐欏叆鏂囦欢淇℃伅
+	hdr, er := tar.FileInfoHeader(fi, "")
+	if er != nil {
+		return er
+	}
+	logger.Debug(srcRelative)
+	hdr.Name = srcRelative
+	logger.Debug("鏂囦欢hdr.name", hdr.Name)
+	if er = tw.WriteHeader(hdr); er != nil {
+		return er
+	}
+	// 鎵撳紑瑕佹墦鍖呯殑鏂囦欢锛屽噯澶囪鍙�
+	fr, er := os.Open(srcFull)
+	if er != nil {
+		return er
+	}
+	defer fr.Close()
+	// 灏嗘枃浠舵暟鎹啓鍏� tw 涓�
+	if _, er = io.Copy(tw, fr); er != nil {
+		return er
+	}
+	return nil
+}
+
+//瑙e寘  鍙互瑙e帇锛屽帇缂╂枃浠堕噷鏈夋枃浠跺す鐨勶紝涔熷彲浠ヨВ鍘嬪帇缂╂枃浠堕噷鍏ㄦ槸鏂囦欢鐨�
+//srcGz寰呰В鍖呮枃浠�
+//dstDir 瑙e寘涔嬪悗瀛樻斁鐨勭洰褰�
+func UnTarGz(srcGz string, dstDir string) error {
+	dstDir = path.Clean(dstDir) + string(os.PathSeparator)
+	//鎵撳紑鍘嬬缉鏂囦欢
+	fr, err := os.Open(srcGz)
+	if err != nil {
+		return err
+	}
+	defer fr.Close()
+	gw, err := gzip.NewReader(fr)
+	defer gw.Close()
+	// 鍒涘缓 tar.Reader 瀵硅薄锛屽噯澶囨墽琛岃В鍖呮搷浣�
+	// 鍙互鐢� tr.Next() 鏉ラ亶鍘嗗寘涓殑鏂囦欢
+	tr := tar.NewReader(gw)
+	// 閬嶅巻鍖呬腑鐨勬枃浠�
+	for hdr, er := tr.Next(); er != io.EOF; hdr, er = tr.Next() {
+		if er != nil {
+			logger.Debug("--------- er:", er)
+			return er
+		}
+		// 鑾峰彇鏂囦欢淇℃伅
+		fi := hdr.FileInfo()
+		// 鑾峰彇缁濆璺緞
+		dstFullPath := dstDir + hdr.Name
+		logger.Debug("--- dstFullPath:", dstFullPath)
+		if hdr.Typeflag == tar.TypeDir {
+			logger.Debug("--- type is floder")
+			// 鍒涘缓鐩綍
+			os.MkdirAll(dstFullPath, fi.Mode().Perm())
+			// 璁剧疆鐩綍鏉冮檺
+			os.Chmod(dstFullPath, fi.Mode().Perm())
+		} else {
+			logger.Debug(dstFullPath, "--- type is file")
+			// 鍒涘缓鏂囦欢鎵�鍦ㄧ殑鐩綍
+
+			strtemp := dstFullPath[:strings.LastIndex(dstFullPath, "\\")+1]
+			//os.MkdirAll(path.Dir(dstFullPath), os.ModePerm)
+
+			os.MkdirAll(strtemp, os.ModePerm)
+			// 灏� tr 涓殑鏁版嵁鍐欏叆鏂囦欢涓�
+			if er := unTarFile(dstFullPath, tr); er != nil {
+				logger.Debug("unTarFile:",er)
+				return er
+			}
+			// 璁剧疆鏂囦欢鏉冮檺
+			os.Chmod(dstFullPath, fi.Mode().Perm())
+		}
+	}
+
+	return nil
+}
+
+// 鍥犱负瑕佸湪 defer 涓叧闂枃浠讹紝鎵�浠ヨ鍗曠嫭鍒涘缓涓�涓嚱鏁�
+func unTarFile(dstFile string, tr *tar.Reader) error {
+	// 鍒涘缓绌烘枃浠讹紝鍑嗗鍐欏叆瑙e寘鍚庣殑鏁版嵁
+	fw, er := os.Create(dstFile)
+	if er != nil {
+		return er
+	}
+	defer fw.Close()
+
+	// 鍐欏叆瑙e寘鍚庣殑鏁版嵁
+	_, er = io.Copy(fw, tr)
+	if er != nil {
+		return er
+	}
+
+	return nil
+}
+
+// 鍒ゆ柇妗f鏄惁瀛樺湪
+func exists(name string) bool {
+	_, err := os.Stat(name)
+	return err == nil || os.IsExist(err)
+}
+
+// 鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+func fileExists(filename string) bool {
+	fi, err := os.Stat(filename)
+	return (err == nil || os.IsExist(err)) && !fi.IsDir()
+}
+
+// 鍒ゆ柇鐩綍鏄惁瀛樺湪
+func dirExists(dirname string) bool {
+	fi, err := os.Stat(dirname)
+	return (err == nil || os.IsExist(err)) && fi.IsDir()
+}
\ No newline at end of file
diff --git a/service/SysService.go b/service/SysService.go
index d643667..1a1f14c 100644
--- a/service/SysService.go
+++ b/service/SysService.go
@@ -235,7 +235,7 @@
 	}
 
 	unPackFilePath := configPatchPath+"/"+identifier+ext
-	err := util.DeCompress(unPackFilePath, unPackPath)
+	err := util.UnTarGz(unPackFilePath, unPackPath)
 	if err !=nil {
 		logger.Debug("UnPack err:",err,"unPackFile:",unPackFilePath)
 		return false

--
Gitblit v1.8.0