--- /dev/null
+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
+}