package main import ( "io/fs" "log" "os" "path" ) var ( WalkerFiles int64 WalkerDirs int64 ) func walker(sink chan Ent, root []string) error { files, err := os.ReadDir(path.Join(root...)) // it is already sorted if err != nil { return err } var info fs.FileInfo ents := make([]Ent, 0, len(files)) for _, file := range files { ent := Ent{name: append([]string{}, append(root, file.Name())...)} info, err = file.Info() if err == nil { if info.IsDir() { ent.name[len(ent.name)-1] += "/" } else if info.Mode().IsRegular() { ent.size = info.Size() } ent.mtime = info.ModTime().Unix() } else { log.Println("can not stat:", path.Join(ent.name...), ":", err) } ents = append(ents, ent) } for _, ent := range ents { sink <- ent if ent.IsDir() { WalkerDirs++ } else { WalkerFiles++ continue } err = walker(sink, ent.name) if err != nil { log.Println("can not stat:", path.Join(ent.name...), ":", err) continue } } return nil }