242 lines
4.2 KiB
Go
242 lines
4.2 KiB
Go
package util
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/eyebluecn/tank/code/tool/result"
|
|
"go/build"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
func PathExists(path string) bool {
|
|
_, err := os.Stat(path)
|
|
if err == nil {
|
|
return true
|
|
} else {
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
} else {
|
|
panic(result.BadRequest(err.Error()))
|
|
}
|
|
}
|
|
}
|
|
|
|
func GetGoPath() string {
|
|
|
|
return build.Default.GOPATH
|
|
|
|
}
|
|
|
|
//get development home path.
|
|
func GetDevHomePath() string {
|
|
|
|
_, file, _, ok := runtime.Caller(0)
|
|
if !ok {
|
|
panic("cannot get dev home path.")
|
|
}
|
|
|
|
//$DevHomePath/code/tool/util/util_file.go
|
|
dir := GetDirOfPath(file)
|
|
dir = GetDirOfPath(dir)
|
|
dir = GetDirOfPath(dir)
|
|
dir = GetDirOfPath(dir)
|
|
|
|
return dir
|
|
}
|
|
|
|
//get home path for application.
|
|
func GetHomePath() string {
|
|
ex, err := os.Executable()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
exPath := filepath.Dir(ex)
|
|
|
|
if EnvMacDevelopment() {
|
|
exPath = GetDevHomePath() + "/tmp"
|
|
}
|
|
|
|
if EnvWinDevelopment() {
|
|
exPath = GetDevHomePath() + "/tmp"
|
|
}
|
|
|
|
return UniformPath(exPath)
|
|
}
|
|
|
|
//get html path
|
|
//dev: return $project/build/html
|
|
//prod: return $application/html
|
|
func GetHtmlPath() string {
|
|
|
|
//开发环境直接使用 build/html 下面的文件
|
|
if EnvWinDevelopment() || EnvMacDevelopment() {
|
|
return GetDevHomePath() + "/build/html"
|
|
}
|
|
return GetHomePath() + "/html"
|
|
}
|
|
|
|
//if directory not exit, create it.
|
|
func MakeDirAll(dirPath string) string {
|
|
|
|
exists := PathExists(dirPath)
|
|
|
|
if !exists {
|
|
|
|
err := os.MkdirAll(dirPath, 0777)
|
|
if err != nil {
|
|
panic("error while creating directory")
|
|
}
|
|
}
|
|
|
|
return dirPath
|
|
}
|
|
|
|
//eg /var/www/xx.log -> /var/www
|
|
func GetDirOfPath(fullPath string) string {
|
|
|
|
index1 := strings.LastIndex(fullPath, "/")
|
|
//maybe windows environment
|
|
index2 := strings.LastIndex(fullPath, "\\")
|
|
index := index1
|
|
if index2 > index1 {
|
|
index = index2
|
|
}
|
|
|
|
return fullPath[:index]
|
|
}
|
|
|
|
//get filename from path. eg /var/www/xx.log -> xx.log
|
|
func GetFilenameOfPath(fullPath string) string {
|
|
|
|
index1 := strings.LastIndex(fullPath, "/")
|
|
//maybe windows env
|
|
index2 := strings.LastIndex(fullPath, "\\")
|
|
index := index1
|
|
if index2 > index1 {
|
|
index = index2
|
|
}
|
|
|
|
return fullPath[index+1:]
|
|
}
|
|
|
|
//try to delete empty dir. true: delete an empty dir, false: delete nothing.
|
|
func DeleteEmptyDir(dirPath string) bool {
|
|
dir, err := ioutil.ReadDir(dirPath)
|
|
if err != nil {
|
|
panic(result.BadRequest("occur error while reading %s %s", dirPath, err.Error()))
|
|
}
|
|
if len(dir) == 0 {
|
|
//empty dir
|
|
err = os.Remove(dirPath)
|
|
if err != nil {
|
|
panic(result.BadRequest("occur error while deleting %s %s", dirPath, err.Error()))
|
|
}
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
//delete empty dir recursive, delete until not empty.
|
|
func DeleteEmptyDirRecursive(dirPath string) {
|
|
|
|
fmt.Printf("recursive delete %v \n", dirPath)
|
|
|
|
tmpPath := dirPath
|
|
for DeleteEmptyDir(tmpPath) {
|
|
|
|
dir := GetDirOfPath(tmpPath)
|
|
|
|
fmt.Printf("try to delete %v\n", dir)
|
|
|
|
tmpPath = dir
|
|
}
|
|
}
|
|
|
|
//get conf path.
|
|
func GetConfPath() string {
|
|
|
|
homePath := GetHomePath()
|
|
filePath := homePath + "/conf"
|
|
exists := PathExists(filePath)
|
|
|
|
if !exists {
|
|
err := os.MkdirAll(filePath, 0777)
|
|
if err != nil {
|
|
panic("error while mkdir " + err.Error())
|
|
}
|
|
}
|
|
|
|
return filePath
|
|
}
|
|
|
|
//get log path.
|
|
func GetLogPath() string {
|
|
|
|
homePath := GetHomePath()
|
|
filePath := homePath + "/log"
|
|
exists := PathExists(filePath)
|
|
|
|
if !exists {
|
|
err := os.MkdirAll(filePath, 0777)
|
|
if err != nil {
|
|
panic("error while mkdir " + err.Error())
|
|
}
|
|
}
|
|
|
|
return filePath
|
|
}
|
|
|
|
//copy file
|
|
func CopyFile(srcPath string, destPath string) (nBytes int64) {
|
|
|
|
srcFileStat, err := os.Stat(srcPath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if !srcFileStat.Mode().IsRegular() {
|
|
panic(fmt.Errorf("%s is not a regular file", srcPath))
|
|
}
|
|
|
|
srcFile, err := os.Open(srcPath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer func() {
|
|
err = srcFile.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
destFile, err := os.Create(destPath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer func() {
|
|
err = destFile.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
nBytes, err = io.Copy(destFile, srcFile)
|
|
return nBytes
|
|
}
|
|
|
|
//1. replace \\ to /
|
|
//2. clean path.
|
|
//3. trim suffix /
|
|
func UniformPath(p string) string {
|
|
p = strings.Replace(p, "\\", "/", -1)
|
|
p = path.Clean(p)
|
|
p = strings.TrimSuffix(p, "/")
|
|
return p
|
|
}
|