|
- package os2
-
- import (
- "os"
- "path/filepath"
-
- "gitlink.org.cn/cloudream/common/pkgs/iterator"
- )
-
- type DirIterator struct {
- rootPath string
- walked bool
- walkedInfos []FileInfo
- index int
- }
-
- type FileInfo struct {
- Path string
- Info os.FileInfo
- }
-
- func (i *DirIterator) MoveNext() (*FileInfo, error) {
- if !i.walked {
- i.walked = true
- // TODO 可以考虑优化成MoveNext一次就产生一个FileInfo的形式
- err := filepath.WalkDir(i.rootPath, func(fname string, fi os.DirEntry, err error) error {
- if err != nil {
- return nil
- }
-
- if !fi.IsDir() {
- info, err := fi.Info()
- if err != nil {
- return err
- }
-
- i.walkedInfos = append(i.walkedInfos, FileInfo{
- Path: fname,
- Info: info,
- })
- }
- return nil
- })
- if err != nil {
- return nil, err
- }
- }
-
- if i.index >= len(i.walkedInfos) {
- return nil, iterator.ErrNoMoreItem
- }
-
- item := i.walkedInfos[i.index]
- i.index++
- return &item, nil
- }
-
- func (i *DirIterator) Close() {
-
- }
-
- func WalkDir(rootPath string) *DirIterator {
- return &DirIterator{
- rootPath: rootPath,
- }
- }
|