]> Sergey Matveev's repositories - glocate.git/blobdiff - walker.go
Improved version
[glocate.git] / walker.go
diff --git a/walker.go b/walker.go
new file mode 100644 (file)
index 0000000..4a91de7
--- /dev/null
+++ b/walker.go
@@ -0,0 +1,52 @@
+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
+}