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