You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
4.3 KiB

2 years ago
  1. package util
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "log"
  7. "os"
  8. "path"
  9. "path/filepath"
  10. "runtime"
  11. "strings"
  12. )
  13. // 判断所给路径文件/文件夹是否存在
  14. func Exists(path string) bool {
  15. _, err := os.Stat(path)
  16. if err == nil {
  17. return true
  18. }
  19. if os.IsExist(err) {
  20. return true
  21. }
  22. if os.IsNotExist(err) {
  23. return false
  24. }
  25. return false
  26. }
  27. // FindFile 查找指定名称的文件
  28. // 从构建后可执行文件所在目录或源码所在目录查找
  29. func FindFile(filename string) (string, error) {
  30. if Exists(filename) {
  31. return filename, nil
  32. }
  33. // 构建后的可执行文件所在目录
  34. execDir, err := filepath.Abs(filepath.Dir(os.Args[0]))
  35. if err != nil {
  36. return "", err
  37. }
  38. if file := recursiveFind(execDir, filename); len(file) > 0 {
  39. return file, nil
  40. }
  41. // 源代码运行时当前文件所在目录或项目根目录
  42. srcDir, err := os.Getwd()
  43. if err != nil {
  44. return "", err
  45. }
  46. if file := recursiveFind(srcDir, filename); len(file) > 0 {
  47. return file, nil
  48. }
  49. var i int
  50. for {
  51. //当前行所在文件路径(从当前 util 文件开始逐层递归调用栈查找)
  52. if _, fn, _, ok := runtime.Caller(i); ok {
  53. if file := recursiveFind(path.Dir(fn), filename); len(file) > 0 {
  54. return file, nil
  55. }
  56. } else {
  57. break
  58. }
  59. i++
  60. }
  61. return "", nil
  62. }
  63. func CreateFilePath(filePath string) error {
  64. fi, err := os.Stat(filePath)
  65. if err == nil && fi.IsDir() {
  66. return fmt.Errorf("%s is not file", filePath)
  67. }
  68. if err != nil {
  69. if os.IsNotExist(err) {
  70. dir := filepath.Dir(filePath)
  71. if err := os.MkdirAll(dir, os.ModePerm); err != nil {
  72. return err
  73. }
  74. } else {
  75. return err
  76. }
  77. }
  78. return nil
  79. }
  80. // 从指定目录查找文件,若指定目录未找到对应文件,则递归从上级目录继续查找。
  81. func recursiveFind(dir, filename string) string {
  82. file := path.Join(dir, filename)
  83. if Exists(file) {
  84. return file
  85. }
  86. // 已经递归到根目录了,且未找到对应文件,则返回空
  87. if dir == filepath.Base(dir) ||
  88. dir == filepath.Join(filepath.VolumeName(dir), filepath.Base(dir)) {
  89. return ""
  90. }
  91. // 未到根目录,继续从上级目录查找
  92. return recursiveFind(filepath.Dir(dir), filename)
  93. }
  94. // 判断所给路径是否为文件夹
  95. func IsDir(path string) bool {
  96. s, err := os.Stat(path)
  97. if err != nil {
  98. return false
  99. }
  100. return s.IsDir()
  101. }
  102. // 判断所给路径是否为文件
  103. func IsFile(path string) bool {
  104. return !IsDir(path)
  105. }
  106. func JoinFilePath(path ...string) string {
  107. s := ""
  108. for _, p := range path {
  109. if strings.TrimSpace(p) == "" {
  110. continue
  111. }
  112. if strings.HasSuffix(p, "/") {
  113. s += p
  114. } else {
  115. s += p + "/"
  116. }
  117. }
  118. s = strings.Replace(strings.TrimSuffix(s, "/"), "/", string(os.PathSeparator), -1)
  119. s = strings.Replace(s, "\\", string(os.PathSeparator), -1)
  120. return s
  121. }
  122. func CopyFile(dstName, srcName string) (written int64, err error) {
  123. src, err := os.Open(srcName)
  124. if err != nil {
  125. return
  126. }
  127. defer func() {
  128. if err := src.Close(); err != nil {
  129. fmt.Println(err)
  130. }
  131. }()
  132. dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
  133. if err != nil {
  134. return
  135. }
  136. defer func() {
  137. if err := dst.Close(); err != nil {
  138. fmt.Println(err)
  139. }
  140. }()
  141. return io.Copy(dst, src)
  142. }
  143. func WriteString(filename string, data string, append, newLine bool) error {
  144. return WriteByte(filename, []byte(data), append, newLine)
  145. }
  146. func WriteByte(filename string, data []byte, append, newLine bool) error {
  147. flag := os.O_RDWR | os.O_CREATE | os.O_SYNC
  148. perm := os.ModePerm
  149. if append {
  150. flag = flag | os.O_APPEND
  151. perm = os.ModeAppend
  152. } else {
  153. flag = flag | os.O_TRUNC
  154. }
  155. f, err := os.OpenFile(filename, flag, perm)
  156. if err != nil {
  157. return err
  158. }
  159. defer func() {
  160. if err := f.Close(); err != nil {
  161. log.Println(err)
  162. }
  163. }()
  164. //return writeFile(f, data, append, newLine)
  165. return writeBufIO(f, data, append, newLine)
  166. }
  167. // 性能较低
  168. func writeFile(file *os.File, data []byte, append, newLine bool) error {
  169. if append && newLine {
  170. if _, err := file.WriteString("\n"); err != nil {
  171. return err
  172. }
  173. }
  174. if _, err := file.Write(data); err != nil {
  175. return err
  176. }
  177. return nil
  178. }
  179. func writeBufIO(file *os.File, data []byte, append, newLine bool) error {
  180. writer := bufio.NewWriter(file)
  181. if append && newLine {
  182. if _, err := writer.WriteString("\n"); err != nil {
  183. return err
  184. }
  185. }
  186. if _, err := writer.Write(data); err != nil {
  187. return err
  188. }
  189. return writer.Flush()
  190. }