PowerEngine/wave_record/fileparse/dir_monitor.go

77 lines
2.1 KiB
Go

// Package fileparse define related functions for comtrade data processing
package fileparse
import (
"context"
"os"
"path/filepath"
"sync"
"wave_record/constant"
"github.com/fsnotify/fsnotify"
"github.com/panjf2000/ants/v2"
"go.uber.org/zap"
)
// DirWatch define function for monitoring directories and passing add file name to channels
func DirWatch(monitorDir string, addChan chan string) {
logger := zap.L()
watcher, err := fsnotify.NewWatcher()
if err != nil {
logger.Error("create dir watcher failed:", zap.Error(err))
}
defer watcher.Close()
err = watcher.Add(monitorDir)
if err != nil {
logger.Error("add monitor dir failed:", zap.Error(err))
}
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Op&fsnotify.Create == fsnotify.Create {
logger.Info("file add in watcher dir", zap.String("file_name", event.Name))
addChan <- event.Name
}
if event.Op&fsnotify.Remove == fsnotify.Remove {
logger.Info("file remove in watcher dir", zap.String("file_name", event.Name))
}
case err, ok := <-watcher.Errors:
if !ok {
logger.Error("monitor watcher error channel closed", zap.Bool("channel_status", ok))
return
}
logger.Error("monitor watcher error occurred", zap.Error(err))
}
}
}
// TraverseMonitorDir define function for traverse the files existing in the directory
func TraverseMonitorDir(ctx context.Context, monitorDir string, dbName string, comtradeMap *sync.Map, addChan chan string, delChan chan string, pool *ants.PoolWithFunc) {
logger := zap.L()
err := filepath.Walk(monitorDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
logger.Error("accessing a path failed", zap.Error(err))
return err
}
fileSuffix := filepath.Ext(path)
if !info.IsDir() && fileSuffix == constant.ConfigFileSuffix {
processComtradeFile(ctx, path, monitorDir, dbName, comtradeMap, addChan, delChan, pool, logger)
}
return nil
})
if err != nil {
logger.Error("traversing files that already exist in the monitor directory failed", zap.Error(err))
}
}