golang 多线程查找文件内容

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "io/ioutil"
 6     "os"
 7     "path/filepath"
 8     "strings"
 9 )
10 
11 var matchCount = 0
12 var ch = make(chan int, 512)
13 
14 func findFile(path string, text string) {
15     var pathArray [100]string
16     var count = 0
17     filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
18         if err != nil {
19         }
20         //find text
21         if !info.IsDir() {
22             if info.Size() < 1024*1024 {
23                 pathArray[count] = path
24                 count++
25                 if count >= 100 {
26                     count = 0
27                     go findText(pathArray[0:100], text)
28                     <-ch
29                 }
30             }
31         }
32         return nil
33     })
34     go findText(pathArray[0:count], text)
35     <-ch
36 
37     fmt.Printf("一共发现了 %d 个匹配的文件", matchCount)
38 
39 }
40 
41 func findText(paths []string, text string) {
42     for _, path := range paths {
43         fi, err := os.Open(path)
44         if err != nil {
45             panic(err)
46         }
47         defer fi.Close()
48         fd, err := ioutil.ReadAll(fi)
49         if err != nil {
50             panic(err)
51         }
52 
53         if strings.Index(string(fd), text) > -1 {
54             matchCount++
55             fmt.Println(path)
56         }
57     }
58     ch <- 1
59 }
60 
61 func main() {
62     args := os.Args
63     if len(args) < 3 {
64         fmt.Println("需要两个参数 path text")
65         return
66     }
67     path := args[1]
68     text := args[2]
69 
70     _, err := os.Stat(path)
71 
72     if err != nil {
73         fmt.Println("path不存在")
74     } else {
75         findFile(path, text)
76     }
77 }

 计数器增加的时候应该加锁

posted on 2015-02-27 10:05  modprobe  阅读(1770)  评论(0编辑  收藏  举报