file.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package pkg
  2. import (
  3. "bufio"
  4. "bytes"
  5. "context"
  6. "fmt"
  7. "io"
  8. "log"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "time"
  13. )
  14. // GetCurrentPath 获取当前路径,比如:E:/abc/data/test
  15. func GetCurrentPath() string {
  16. dir, err := os.Getwd()
  17. if err != nil {
  18. fmt.Println(err)
  19. }
  20. return strings.Replace(dir, "\\", "/", -1)
  21. }
  22. func PathCreate(dir string) error {
  23. return os.MkdirAll(dir, os.ModePerm)
  24. }
  25. // PathExist 判断目录是否存在
  26. func PathExist(addr string) bool {
  27. s, err := os.Stat(addr)
  28. if err != nil {
  29. log.Println(err)
  30. return false
  31. }
  32. return s.IsDir()
  33. }
  34. func FileCreate(content bytes.Buffer, name string) {
  35. file, err := os.Create(name)
  36. defer func(file *os.File) {
  37. err := file.Close()
  38. if err != nil {
  39. log.Fatalln(err)
  40. }
  41. }(file)
  42. if err != nil {
  43. log.Println(err)
  44. }
  45. _, err = file.WriteString(content.String())
  46. if err != nil {
  47. log.Println(err)
  48. }
  49. }
  50. // GetFileSize 获取文件大小
  51. func GetFileSize(filename string) int64 {
  52. var result int64
  53. err := filepath.Walk(filename, func(path string, f os.FileInfo, err error) error {
  54. result = f.Size()
  55. return nil
  56. })
  57. if err != nil {
  58. log.Println(err)
  59. return 0
  60. }
  61. return result
  62. }
  63. // FileMonitoringById 监听指定文件的变更,并调用hookFn函数处理每一行内容
  64. func FileMonitoringById(ctx context.Context, filePath string, id string, group string, hookFn func(context.Context, string, string, []byte)) {
  65. file, err := os.Open(filePath)
  66. if err != nil {
  67. log.Fatalln(err)
  68. }
  69. defer func(file *os.File) {
  70. err := file.Close()
  71. if err != nil {
  72. log.Fatalln(err)
  73. }
  74. }(file)
  75. // 创建一个缓冲读取器
  76. rd := bufio.NewReader(file)
  77. // 获取文件长度
  78. _, err = file.Seek(0, 2)
  79. if err != nil {
  80. return
  81. }
  82. for {
  83. if ctx.Err() != nil {
  84. break
  85. }
  86. line, err := rd.ReadBytes('\n')
  87. // 如果是文件末尾则等待一段时间后继续循环
  88. if err == io.EOF {
  89. time.Sleep(500 * time.Millisecond)
  90. continue
  91. } else if err != nil {
  92. log.Fatalln(err)
  93. }
  94. go hookFn(ctx, id, group, line)
  95. }
  96. }
  97. // ReplaceText 替换文本
  98. func ReplaceText(root string, oldText string, newText string) error {
  99. h := &ReplaceHelper{
  100. Root: root,
  101. OldText: oldText,
  102. NewText: newText,
  103. }
  104. return h.DoWork()
  105. }
  106. type ReplaceHelper struct {
  107. Root string //路径
  108. OldText string //需要替换的文本
  109. NewText string //新的文本
  110. }
  111. func (h *ReplaceHelper) DoWork() error {
  112. return filepath.Walk(h.Root, h.walkCallback)
  113. }
  114. func (h *ReplaceHelper) walkCallback(path string, f os.FileInfo, err error) error {
  115. if err != nil {
  116. return err
  117. }
  118. if f == nil {
  119. return nil
  120. }
  121. if f.IsDir() {
  122. log.Println("DIR:", path)
  123. return nil
  124. }
  125. buf, err := os.ReadFile(path)
  126. if err != nil {
  127. return err
  128. }
  129. content := string(buf)
  130. log.Printf("h.OldText: %s \n", h.OldText)
  131. log.Printf("h.NewText: %s \n", h.NewText)
  132. //替换
  133. newContent := strings.Replace(content, h.OldText, h.NewText, -1)
  134. //重新写入
  135. err = os.WriteFile(path, []byte(newContent), 0)
  136. if err != nil {
  137. return err
  138. }
  139. return err
  140. }