fonchain-fiee/pkg/service/cron_delayDeleteFile.go

96 lines
2.1 KiB
Go
Raw Normal View History

2025-02-19 06:24:15 +00:00
// 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
}
}