X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;ds=sidebyside;f=walker.go;fp=walker.go;h=4a91de74609ee168da17e75a325acff5bdc55e869b8fedc0f8f3ec731b2c2ecd;hb=d5b8c235a1f3088c6c1e7261df3d1b565d042db2ba2ad1bbd1018782b9178e1f;hp=0000000000000000000000000000000000000000000000000000000000000000;hpb=411a031ec7cc707b8269acc3dfe28bc8db1bab5a9a91781c26809ae9853c6f6a;p=glocate.git diff --git a/walker.go b/walker.go new file mode 100644 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 +}