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()
|
}
|