directory.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package utils
  2. import (
  3. "errors"
  4. "os"
  5. "path/filepath"
  6. "reflect"
  7. "strings"
  8. "go.uber.org/zap"
  9. "server/global"
  10. )
  11. //@author: [piexlmax](https://github.com/piexlmax)
  12. //@function: PathExists
  13. //@description: 文件目录是否存在
  14. //@param: path string
  15. //@return: bool, error
  16. func PathExists(path string) (bool, error) {
  17. fi, err := os.Stat(path)
  18. if err == nil {
  19. if fi.IsDir() {
  20. return true, nil
  21. }
  22. return false, errors.New("存在同名文件")
  23. }
  24. if os.IsNotExist(err) {
  25. return false, nil
  26. }
  27. return false, err
  28. }
  29. //@author: [piexlmax](https://github.com/piexlmax)
  30. //@function: CreateDir
  31. //@description: 批量创建文件夹
  32. //@param: dirs ...string
  33. //@return: err error
  34. func CreateDir(dirs ...string) (err error) {
  35. for _, v := range dirs {
  36. exist, err := PathExists(v)
  37. if err != nil {
  38. return err
  39. }
  40. if !exist {
  41. global.GVA_LOG.Debug("create directory" + v)
  42. if err := os.MkdirAll(v, os.ModePerm); err != nil {
  43. global.GVA_LOG.Error("create directory"+v, zap.Any(" error:", err))
  44. return err
  45. }
  46. }
  47. }
  48. return err
  49. }
  50. //@author: [songzhibin97](https://github.com/songzhibin97)
  51. //@function: FileMove
  52. //@description: 文件移动供外部调用
  53. //@param: src string, dst string(src: 源位置,绝对路径or相对路径, dst: 目标位置,绝对路径or相对路径,必须为文件夹)
  54. //@return: err error
  55. func FileMove(src string, dst string) (err error) {
  56. if dst == "" {
  57. return nil
  58. }
  59. src, err = filepath.Abs(src)
  60. if err != nil {
  61. return err
  62. }
  63. dst, err = filepath.Abs(dst)
  64. if err != nil {
  65. return err
  66. }
  67. revoke := false
  68. dir := filepath.Dir(dst)
  69. Redirect:
  70. _, err = os.Stat(dir)
  71. if err != nil {
  72. err = os.MkdirAll(dir, 0o755)
  73. if err != nil {
  74. return err
  75. }
  76. if !revoke {
  77. revoke = true
  78. goto Redirect
  79. }
  80. }
  81. return os.Rename(src, dst)
  82. }
  83. func DeLFile(filePath string) error {
  84. return os.RemoveAll(filePath)
  85. }
  86. //@author: [songzhibin97](https://github.com/songzhibin97)
  87. //@function: TrimSpace
  88. //@description: 去除结构体空格
  89. //@param: target interface (target: 目标结构体,传入必须是指针类型)
  90. //@return: null
  91. func TrimSpace(target interface{}) {
  92. t := reflect.TypeOf(target)
  93. if t.Kind() != reflect.Ptr {
  94. return
  95. }
  96. t = t.Elem()
  97. v := reflect.ValueOf(target).Elem()
  98. for i := 0; i < t.NumField(); i++ {
  99. switch v.Field(i).Kind() {
  100. case reflect.String:
  101. v.Field(i).SetString(strings.TrimSpace(v.Field(i).String()))
  102. }
  103. }
  104. }
  105. // FileExist 判断文件是否存在
  106. func FileExist(path string) bool {
  107. fi, err := os.Lstat(path)
  108. if err == nil {
  109. return !fi.IsDir()
  110. }
  111. return !os.IsNotExist(err)
  112. }