purge.go 873 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package fileutil
  2. import (
  3. "log"
  4. "os"
  5. "path"
  6. "sort"
  7. "strings"
  8. "time"
  9. )
  10. func PurgeFile(dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}) <-chan error {
  11. errC := make(chan error, 1)
  12. go func() {
  13. for {
  14. fnames, err := ReadDir(dirname)
  15. if err != nil {
  16. errC <- err
  17. return
  18. }
  19. newfnames := make([]string, 0)
  20. for _, fname := range fnames {
  21. if strings.HasSuffix(fname, suffix) {
  22. newfnames = append(newfnames, fname)
  23. }
  24. }
  25. sort.Strings(newfnames)
  26. for len(newfnames) > int(max) {
  27. f := path.Join(dirname, newfnames[0])
  28. err := os.Remove(f)
  29. if err != nil {
  30. errC <- err
  31. return
  32. }
  33. log.Printf("filePurge: successfully remvoed file %s", f)
  34. newfnames = newfnames[1:]
  35. }
  36. select {
  37. case <-time.After(interval):
  38. case <-stop:
  39. return
  40. }
  41. }
  42. }()
  43. return errC
  44. }