Skip to content
Snippets Groups Projects

add go implementation parallel walking the directory tree

Merged Florian Fischer requested to merge go-parallel into master
3 files
+ 98
1
Compare changes
  • Side-by-side
  • Inline
Files
3
+ 94
0
package main
import (
"bufio"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"sync"
)
var needle string
var wg sync.WaitGroup
func search(path string) {
defer wg.Done()
f, err := os.Open(path)
if err != nil {
log.Fatal(err)
}
defer f.Close()
r := bufio.NewReader(f)
b := make([]byte, 4096)
for {
n, err := r.Read(b)
if err != nil {
if err == io.EOF {
return
}
log.Fatal("Error reading file:", err)
}
s := string(b[0:n])
if strings.Contains(s, needle) {
fmt.Println(path)
return
}
}
return
}
func walk_dir(dir string) {
defer wg.Done()
var visit = func(path string, finfo os.FileInfo, err error) error {
if err != nil {
fmt.Printf("error %v at path %s\n", err, path)
return err
}
// ascent concurrently
if finfo.IsDir() && path != dir {
wg.Add(1)
go walk_dir(path)
return filepath.SkipDir
}
if finfo.Mode().IsRegular() {
wg.Add(1)
go search(path)
}
return nil
}
var err = filepath.Walk(dir, visit)
if err != nil {
log.Fatal("error walking the path %q: %v\n", dir, err)
}
}
func main() {
if len(os.Args) < 2 {
log.Fatalf("Usage: %q <needle>", os.Args[0])
}
needle = os.Args[1]
myDir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
wg.Add(1)
walk_dir(myDir)
wg.Wait()
}
Loading