package utils import ( "archive/zip" "basic.com/valib/logger.git" "bufio" "bytes" "crypto/md5" "errors" "fmt" "io" "io/ioutil" "os" "os/exec" "path" "path/filepath" "runtime" ) func GetExePath() string { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if nil != err { dir = "./" } return dir } func PathExists(path string) bool { _, err := os.Stat(path) if nil == err { return true } if os.IsNotExist(err) { return false } return false } func ShellExecute(dir, exe string, args ...string) (string, error) { cmd := exec.Command(exe, args...) stdout, err := cmd.StdoutPipe() if nil != err { msg := fmt.Sprintf("ShellExecute cmd.StdoutPipe err:%v", err) return "", errors.New(msg) } cmd.Stderr = os.Stderr if "" != dir { cmd.Dir = dir } err = cmd.Start() if nil != err { msg := fmt.Sprintf("ShellExecute cmd.Start err:%v", err) return "", errors.New(msg) } var buffer bytes.Buffer reader := bufio.NewReader(stdout) for { line, err2 := reader.ReadString('\n') if io.EOF == err2 { break } if nil != err2 { msg := fmt.Sprintf("ShellExecute reader.ReadString err:%v", err2) return "", errors.New(msg) } buffer.WriteString(line) } err = cmd.Wait() if nil != err { msg := fmt.Sprintf("ShellExecute cmd.Wait err:%v", err) return "", errors.New(msg) } return buffer.String(), nil } func DeCompressZip(zipFile, dest string) error { reader, err := zip.OpenReader(zipFile) if err != nil { return err } defer reader.Close() for _, f := range reader.Reader.File { if f.FileInfo().IsDir() { fullPath := path.Join(dest, f.Name) err = os.MkdirAll(fullPath, os.ModePerm) if err != nil { return err } continue } r, err := f.Open() if err != nil { return err } defer r.Close() fullPath := path.Join(dest, f.Name) w, err := os.Create(fullPath) if err != nil { return err } defer w.Close() _, err = io.Copy(w, r) if err != nil { return err } } return nil } func Md5sum(filepath string) (string, error) { f, err := os.Open(filepath) if nil != err { return "", err } defer f.Close() payload, err := ioutil.ReadAll(f) if nil != err { return "", err } md5sum := fmt.Sprintf("%x", md5.Sum(payload)) runtime.GC() return md5sum, nil } //强制更新文件内容,(与copy命令有区别) func CopyFileContents(src, dest string) (err error) { in, err := os.Open(src) if nil != err { return } defer in.Close() if PathExists(dest) { //替换前重命名备份原来文件 tmpDest := dest + "1" os.Rename(dest, tmpDest) } out, err := os.Create(dest) if nil != err { return } defer func() { cErr := out.Close() if nil != cErr { err = cErr } }() if _, err = io.Copy(out, in); err != nil { return } err = out.Sync() return } func DeCompressTGZ(gzFile, dest string) (err error) { logger.Info("开始解压" + gzFile + "到" + dest + "\n") command := "tar -zxf " + gzFile + " -C " + dest result, err := execCommand(command) logger.Info("执行命令:", command) logger.Info(string(result) + "\n") logger.Info("解压" + gzFile + "到" + dest + "完成!") return } func CompressTGZ(gzFile, dest string) (err error) { logger.Info("开始压缩" + gzFile + " " + dest + "\n") command := "tar -zcf " + gzFile + " -C " + dest + " ." result, err := execCommand(command) if err != nil { logger.Error("压缩失败"+gzFile+" "+dest+",error:", err) return } logger.Info(string(result) + "\n") logger.Info("压缩" + gzFile + " " + dest + "完成!") return } //执行命令 func execCommand(cmd string) ([]byte, error) { return exec.Command("/bin/bash", "-c", cmd).Output() }