package pkg import ( "bufio" "bytes" "context" "fmt" "io" "log" "os" "path/filepath" "strings" "time" ) // GetCurrentPath 获取当前路径,比如:E:/abc/data/test func GetCurrentPath() string { dir, err := os.Getwd() if err != nil { fmt.Println(err) } return strings.Replace(dir, "\\", "/", -1) } func PathCreate(dir string) error { return os.MkdirAll(dir, os.ModePerm) } // PathExist 判断目录是否存在 func PathExist(addr string) bool { s, err := os.Stat(addr) if err != nil { log.Println(err) return false } return s.IsDir() } func FileCreate(content bytes.Buffer, name string) { file, err := os.Create(name) defer func(file *os.File) { err := file.Close() if err != nil { log.Fatalln(err) } }(file) if err != nil { log.Println(err) } _, err = file.WriteString(content.String()) if err != nil { log.Println(err) } } // GetFileSize 获取文件大小 func GetFileSize(filename string) int64 { var result int64 err := filepath.Walk(filename, func(path string, f os.FileInfo, err error) error { result = f.Size() return nil }) if err != nil { log.Println(err) return 0 } return result } // FileMonitoringById 监听指定文件的变更,并调用hookFn函数处理每一行内容 func FileMonitoringById(ctx context.Context, filePath string, id string, group string, hookFn func(context.Context, string, string, []byte)) { file, err := os.Open(filePath) if err != nil { log.Fatalln(err) } defer func(file *os.File) { err := file.Close() if err != nil { log.Fatalln(err) } }(file) // 创建一个缓冲读取器 rd := bufio.NewReader(file) // 获取文件长度 _, err = file.Seek(0, 2) if err != nil { return } for { if ctx.Err() != nil { break } line, err := rd.ReadBytes('\n') // 如果是文件末尾则等待一段时间后继续循环 if err == io.EOF { time.Sleep(500 * time.Millisecond) continue } else if err != nil { log.Fatalln(err) } go hookFn(ctx, id, group, line) } } // ReplaceText 替换文本 func ReplaceText(root string, oldText string, newText string) error { h := &ReplaceHelper{ Root: root, OldText: oldText, NewText: newText, } return h.DoWork() } type ReplaceHelper struct { Root string //路径 OldText string //需要替换的文本 NewText string //新的文本 } func (h *ReplaceHelper) DoWork() error { return filepath.Walk(h.Root, h.walkCallback) } func (h *ReplaceHelper) walkCallback(path string, f os.FileInfo, err error) error { if err != nil { return err } if f == nil { return nil } if f.IsDir() { log.Println("DIR:", path) return nil } buf, err := os.ReadFile(path) if err != nil { return err } content := string(buf) log.Printf("h.OldText: %s \n", h.OldText) log.Printf("h.NewText: %s \n", h.NewText) //替换 newContent := strings.Replace(content, h.OldText, h.NewText, -1) //重新写入 err = os.WriteFile(path, []byte(newContent), 0) if err != nil { return err } return err }