96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
// 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
|
|
}
|
|
}
|