// Package service ----------------------------- // @file : cron_delayDeleteFile.go // @author : JJXu // @contact : wavingbear@163.com // @time : 2023/9/4 9:16 // ------------------------------------------- package service import ( "fmt" "github.com/robfig/cron/v3" "os" "sort" "sync" "time" ) // 延时删除文件 var DelayDeleteFileTask = new(delayDeleteFileTask) type DelayDeleteFile struct { Path string RetentionTime time.Time //保留时间 } type delayDeleteFileTask struct { pendingDeleteFile []DelayDeleteFile locker sync.Mutex } func (d *delayDeleteFileTask) AddTimerTask(c *cron.Cron) error { _, err := c.AddFunc("* * * * *", func() { d.Run() }) return err } func (d *delayDeleteFileTask) AddPendingDeleteFile(files ...DelayDeleteFile) { d.locker.Lock() defer d.locker.Unlock() for _, f := range files { if d.fileExists(f.Path) { var now = time.Now() if f.RetentionTime.Before(now) { if d.deleteFile(f.Path) == nil { return } } d.pendingDeleteFile = append(d.pendingDeleteFile, f) if len(d.pendingDeleteFile) > 1 { sort.Slice(d.pendingDeleteFile, func(i, j int) bool { return d.pendingDeleteFile[i].RetentionTime.Before(d.pendingDeleteFile[j].RetentionTime) }) } } else { fmt.Println("AddPendingDeleteFile: 文件不存在:" + f.Path) } } } func (d *delayDeleteFileTask) Run() error { d.locker.Lock() defer d.locker.Unlock() if len(d.pendingDeleteFile) == 0 { return nil } var now = time.Now() var tmpFile []DelayDeleteFile for i, f := range d.pendingDeleteFile { if f.RetentionTime.Before(now) { if d.deleteFile(f.Path) == nil { fmt.Println("文件已删除:" + f.Path) } else { tmpFile = append(tmpFile, d.pendingDeleteFile[i]) } } } d.pendingDeleteFile = tmpFile return nil } func (d *delayDeleteFileTask) deleteFile(path string) error { if d.fileExists(path) { return os.RemoveAll(path) } return nil } func (d *delayDeleteFileTask) fileExists(path string) bool { // 检查路径是否存在 _, err := os.Stat(path) if os.IsNotExist(err) { fmt.Printf("路径 %s 不存在\n", path) return false } else { return true } }