根目录不包含子目录,使用[]os.FileInfo
切片定义文件按时间排序。按时间从远到近排序,文件总数如果大于 5 个,就从远的开始删除。
package main
import (
"fmt"
"log"
"os"
"sort"
"strings"
"time"
)
type ByModTime []os.FileInfo
func (fis ByModTime) Len() int {
return len(fis)
}
func (fis ByModTime) Swap(i, j int) {
fis[i], fis[j] = fis[j], fis[i]
}
func (fis ByModTime) Less(i, j int) bool {
return fis[i].ModTime().Before(fis[j].ModTime())
}
// 根目录下的文件按时间大小排序,从远到近
func SortFile(path, name string) (files ByModTime) {
f, err := os.Open(path)
if err != nil {
fmt.Println(err)
}
fis, err := f.Readdir(-1)
if err != nil {
fmt.Println(err)
}
defer f.Close()
files = make(ByModTime, len(fis)+10)
j := 0
for i, v := range fis {
if strings.Contains(fis[i].Name(), name) {
files[j] = v
j++
}
}
files = files[:j]
sort.Sort(ByModTime(files))
// for _, fi := range files {
// fmt.Println(fi.Name())
// }
return
}
// 返回当下时间的文件,并删除大于 5 个的文件,删除最早的,如果目录下没有文件,就自动创建
func DealWithFiles(path, name string) (filename string) {
timestamp := time.Now().Format("20060102.150405")
filename = path + name + "." + timestamp
files := SortFile(path, name)
// fmt.Println(path + files[len(files)-1].Name())
if len(files) > 5 {
for k, _ := range files[5:] {
err := os.Remove(path + files[k].Name())
if err != nil {
log.Fatal(err)
}
}
} else if len(files) == 0 {
f, err := os.Create(filename)
defer f.Close()
if err != nil {
log.Fatal(err)
}
}
// fmt.Println(filename)
return filename
}
func main() {
path := "/res/csv/"
name := "user.csv"
files := DealWithFiles(path, name)
fmt.Println(files)
}
文件格式为:
# tree /res/csv
/res/csv
├── user.csv.20201206.153543
├── user.csv.20201206.153655
├── user.csv.20201206.153715
├── user.csv.20201206.153749
└── user.csv.20201206.154620
执行结果:
#go run /go/eg/1.go
/res/csv/user.csv.20201207.090806