scanner.go 953 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package godirwalk
  2. import "sort"
  3. type scanner interface {
  4. Dirent() (*Dirent, error)
  5. Err() error
  6. Name() string
  7. Scan() bool
  8. }
  9. // sortedScanner enumerates through a directory's contents after reading the
  10. // entire directory and sorting the entries by name. Used by walk to simplify
  11. // its implementation.
  12. type sortedScanner struct {
  13. dd []*Dirent
  14. de *Dirent
  15. }
  16. func newSortedScanner(osPathname string, scratchBuffer []byte) (*sortedScanner, error) {
  17. deChildren, err := ReadDirents(osPathname, scratchBuffer)
  18. if err != nil {
  19. return nil, err
  20. }
  21. sort.Sort(deChildren)
  22. return &sortedScanner{dd: deChildren}, nil
  23. }
  24. func (d *sortedScanner) Err() error {
  25. d.dd, d.de = nil, nil
  26. return nil
  27. }
  28. func (d *sortedScanner) Dirent() (*Dirent, error) { return d.de, nil }
  29. func (d *sortedScanner) Name() string { return d.de.name }
  30. func (d *sortedScanner) Scan() bool {
  31. if len(d.dd) > 0 {
  32. d.de, d.dd = d.dd[0], d.dd[1:]
  33. return true
  34. }
  35. return false
  36. }