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