dir.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package utils
  2. import (
  3. "github.com/pkg/errors"
  4. "net/http"
  5. "os"
  6. "path/filepath"
  7. "reflect"
  8. "strings"
  9. )
  10. //@author: [piexlmax](https://github.com/piexlmax)
  11. //@function: PathExists
  12. //@description: 文件目录是否存在
  13. //@param: path string
  14. //@return: bool, error
  15. func PathExists(path string) (bool, error) {
  16. fi, err := os.Stat(path)
  17. if err == nil {
  18. if fi.IsDir() {
  19. return true, nil
  20. }
  21. return false, errors.New("存在同名文件")
  22. }
  23. if os.IsNotExist(err) {
  24. return false, nil
  25. }
  26. return false, err
  27. }
  28. //@author: [piexlmax](https://github.com/piexlmax)
  29. //@function: CreateDir
  30. //@description: 批量创建文件夹
  31. //@param: dirs ...string
  32. //@return: err error
  33. func CreateDir(dirs ...string) (err error) {
  34. for _, v := range dirs {
  35. exist, err := PathExists(v)
  36. if err != nil {
  37. return err
  38. }
  39. if !exist {
  40. if err := os.MkdirAll(v, os.ModePerm); err != nil {
  41. return err
  42. }
  43. }
  44. }
  45. return err
  46. }
  47. //@author: [songzhibin97](https://github.com/songzhibin97)
  48. //@function: FileMove
  49. //@description: 文件移动供外部调用
  50. //@param: src string, dst string(src: 源位置,绝对路径or相对路径, dst: 目标位置,绝对路径or相对路径,必须为文件夹)
  51. //@return: err error
  52. func FileMove(src string, dst string) (err error) {
  53. if dst == "" {
  54. return nil
  55. }
  56. src, err = filepath.Abs(src)
  57. if err != nil {
  58. return err
  59. }
  60. dst, err = filepath.Abs(dst)
  61. if err != nil {
  62. return err
  63. }
  64. revoke := false
  65. dir := filepath.Dir(dst)
  66. Redirect:
  67. _, err = os.Stat(dir)
  68. if err != nil {
  69. err = os.MkdirAll(dir, 0o755)
  70. if err != nil {
  71. return err
  72. }
  73. if !revoke {
  74. revoke = true
  75. goto Redirect
  76. }
  77. }
  78. return os.Rename(src, dst)
  79. }
  80. func DeLFile(filePath string) error {
  81. return os.RemoveAll(filePath)
  82. }
  83. //@author: [songzhibin97](https://github.com/songzhibin97)
  84. //@function: TrimSpace
  85. //@description: 去除结构体空格
  86. //@param: target interface (target: 目标结构体,传入必须是指针类型)
  87. //@return: null
  88. func TrimSpace(target interface{}) {
  89. t := reflect.TypeOf(target)
  90. if t.Kind() != reflect.Ptr {
  91. return
  92. }
  93. t = t.Elem()
  94. v := reflect.ValueOf(target).Elem()
  95. for i := 0; i < t.NumField(); i++ {
  96. switch v.Field(i).Kind() {
  97. case reflect.String:
  98. v.Field(i).SetString(strings.TrimSpace(v.Field(i).String()))
  99. }
  100. }
  101. }
  102. // FileExist 判断文件是否存在
  103. func FileExist(path string) bool {
  104. fi, err := os.Lstat(path)
  105. if err == nil {
  106. return !fi.IsDir()
  107. }
  108. return !os.IsNotExist(err)
  109. }
  110. // AbsPath 绝对路径生成
  111. func AbsPath(args ...string) string {
  112. absPath, err := os.Getwd()
  113. if err != nil {
  114. return ""
  115. }
  116. savePath := ToPath(absPath, ToPath(args...))
  117. err = CheckPathIsExist(savePath)
  118. if err != nil {
  119. return ""
  120. }
  121. return savePath
  122. }
  123. // ToPath 转化成路径
  124. func ToPath(args ...string) string {
  125. if len(args) == 0 {
  126. return ""
  127. }
  128. strList := make([]string, 0)
  129. for i, p := range args {
  130. if strings.TrimSpace(p) == "" {
  131. continue
  132. }
  133. if i == 0 {
  134. strList = append(strList, strings.TrimRight(strings.TrimSpace(p), "/"))
  135. continue
  136. }
  137. strList = append(strList, strings.Trim(strings.TrimSpace(p), "/"))
  138. }
  139. return strings.Join(strList, "/")
  140. }
  141. // CheckPathIsExist 检查路径并创建
  142. func CheckPathIsExist(filePath string) error {
  143. _, err := os.Stat(filePath)
  144. if err != nil {
  145. if os.IsNotExist(err) {
  146. err = os.MkdirAll(filePath, os.ModePerm) //生成多级目录
  147. if err != nil {
  148. return err
  149. }
  150. return err
  151. }
  152. }
  153. return err
  154. }
  155. // GetFileContentType 获取文件类型
  156. func GetFileContentType(out *os.File) (string, error) {
  157. // Only the first 512 bytes are used to sniff the content type.
  158. buffer := make([]byte, 512)
  159. _, err := out.Read(buffer)
  160. if err != nil {
  161. return "", err
  162. }
  163. // Use the net/http package's handy DectectContentType function. Always returns a valid
  164. // content-type by returning "application/octet-stream" if no others seemed to match.
  165. contentType := http.DetectContentType(buffer)
  166. return contentType, nil
  167. }