| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- 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
- }
|