purge.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. l, err := NewLock(f)
  29. if err != nil {
  30. errC <- err
  31. return
  32. }
  33. err = l.TryLock()
  34. if err != nil {
  35. break
  36. }
  37. err = os.Remove(f)
  38. if err != nil {
  39. errC <- err
  40. return
  41. }
  42. err = l.Unlock()
  43. if err != nil {
  44. log.Printf("filePurge: unlock %s error %v", l.Name(), err)
  45. }
  46. err = l.Destroy()
  47. if err != nil {
  48. log.Printf("filePurge: destroy lock %s error %v", l.Name(), err)
  49. }
  50. log.Printf("filePurge: successfully removed file %s", f)
  51. newfnames = newfnames[1:]
  52. }
  53. select {
  54. case <-time.After(interval):
  55. case <-stop:
  56. return
  57. }
  58. }
  59. }()
  60. return errC
  61. }