file.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package fileop
  2. import (
  3. "fmt"
  4. "math"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "crazy-fox-backend-api/utils"
  9. "github.com/pkg/errors"
  10. )
  11. // FileMove 文件移动供外部调用
  12. // @param: src string, dst string(src: 源位置,绝对路径or相对路径, dst: 目标位置,绝对路径or相对路径,必须为文件夹)
  13. // @return: err error
  14. func FileMove(src string, dst string) (err error) {
  15. if dst == "" {
  16. return nil
  17. }
  18. src, err = filepath.Abs(src)
  19. if err != nil {
  20. return err
  21. }
  22. dst, err = filepath.Abs(dst)
  23. if err != nil {
  24. return err
  25. }
  26. revoke := false
  27. dir := filepath.Dir(dst)
  28. Redirect:
  29. _, err = os.Stat(dir)
  30. if err != nil {
  31. err = os.MkdirAll(dir, 0o755)
  32. if err != nil {
  33. return err
  34. }
  35. if !revoke {
  36. revoke = true
  37. goto Redirect
  38. }
  39. }
  40. return os.Rename(src, dst)
  41. }
  42. // FileDel 删除文件
  43. func FileDel(filePath string) error {
  44. return os.RemoveAll(filePath)
  45. }
  46. // FileExist 判断文件是否存在
  47. func FileExist(path string) bool {
  48. exist, err := Exist(path)
  49. if err != nil || !exist {
  50. return false
  51. }
  52. return IsFile(path)
  53. }
  54. // FileRename 文件重命名
  55. func FileRename(oldName, newName string) error {
  56. return os.Rename(oldName, newName)
  57. }
  58. // FileSizeFormat 格式化文件的大小
  59. func FileSizeFormat(s uint64) string {
  60. if s < 10 {
  61. return fmt.Sprintf("%d B", s)
  62. }
  63. sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"}
  64. e := math.Floor(utils.LogN(float64(s), 1024))
  65. suffix := sizes[int(e)]
  66. val := math.Floor(float64(s)/math.Pow(1024, e)*10+0.5) / 10
  67. return fmt.Sprintf(utils.Ternary(val < 10, "%.1f %s", "%.0f %s"), val, suffix)
  68. }
  69. // FileSave 保存文件
  70. func FileSave(data []byte, dirPath string, fileName string) error {
  71. if err := DirCreate(dirPath); err != nil {
  72. return errors.WithStack(err)
  73. }
  74. fileHandle, err := os.Create(filepath.Join(dirPath, fileName))
  75. if err != nil {
  76. return errors.WithStack(err)
  77. }
  78. defer fileHandle.Close()
  79. _, err = fileHandle.Write(data)
  80. if err != nil {
  81. return errors.WithStack(err)
  82. }
  83. return nil
  84. }
  85. // fileTypeName 文件类型名
  86. func fileTypeName(fileType string) string {
  87. switch fileType {
  88. case "d": // 目录文件
  89. return "文件夹"
  90. case "c": // 字符设备文件
  91. return "字符设备"
  92. case "b": // 块设备文件
  93. return "块设备"
  94. case "l": // 符号链接文件
  95. return "符号链接"
  96. case "s": // 套接字文件
  97. return "套接字文件"
  98. case "p": // 管道文件
  99. return "管道文件"
  100. case "?": // 未知文件
  101. return "未知文件"
  102. default: // 普通文件
  103. return strings.ToUpper(fileType) + " 文件"
  104. }
  105. }
  106. // FileType 文件类型
  107. func FileType(fileInfo os.FileInfo) string {
  108. fileType := fileInfo.Mode().String()[0:1]
  109. // 普通文件
  110. if fileType == "-" {
  111. split := strings.Split(fileInfo.Name(), ".")
  112. fileType = split[len(split)-1]
  113. if fileType == "" {
  114. fileType = "?"
  115. }
  116. }
  117. return strings.ToLower(fileType)
  118. }
  119. // IsFile 判断所给路径是否为文件
  120. func IsFile(path string) bool {
  121. return !IsDir(path)
  122. }