猿问

无法使用等待组遍历文件夹

我有这个简单的脚本来尝试遍历文件系统并逐行读取文件以匹配正则表达式上的行:


package main


import (

  "bufio"

  "fmt"

  "io/ioutil"

  "log"

  "os"

  "regexp"

  "sync"

)


type FileWithLine struct{

  Line int

  Path string

}


var set = map[string]FileWithLine{}

var rgx = regexp.MustCompile("ErrId\\s*:\\s*\"[[:alnum:]]+\"");



func traverseDir(d string, wg *sync.WaitGroup){


  fmt.Println("traversing dir:", d)


  if d == ".git"{

    return

  }


  wg.Add(1)

  go func(wg *sync.WaitGroup){


    defer wg.Done()


    files, err := ioutil.ReadDir(d)


    if err != nil {

      log.Fatal(err)

    }


    for _, f := range files {


      fmt.Println("we see file:", f.Name())


      if f.IsDir() {

       traverseDir(f.Name(), wg)

       return

      }


      file, err := os.Open(f.Name())


      if err != nil {

       log.Fatalf("failed opening file: %s", err)

      }


      scanner := bufio.NewScanner(file)

      scanner.Split(bufio.ScanLines)



      for scanner.Scan() {

      var line = scanner.Text()


      if rgx.MatchString(line) {

        fmt.Println("line matches:", line);

      }


      }


      file.Close()



    }


  }(wg)



}


func main()  {

  var wg sync.WaitGroup

  traverseDir(".", &wg)

  fmt.Println("Main: Waiting for workers to finish")

  wg.Wait()

  fmt.Println("Main: Completed")

}

问题是它在读取所有文件之前就退出了,我得到了这个输出:


traversing dir: .

Main: Waiting for workers to finish

we see file: .git

traversing dir: .git

Main: Completed

但是当前目录中有更多文件,而不仅仅是 .git 文件夹。碰巧 .git 文件夹是当前工作目录中的第一项,然后立即退出。有人知道为什么我的程序很早就令人兴奋吗?


吃鸡游戏
浏览 101回答 1
1回答

慕沐林林

由于以下几行,它正在停止处理:if f.IsDir() {   traverseDir(f.Name(), wg)   return}当它看到一个目录时,它会进入并立即返回,而不处理当前目录中的剩余文件。并且当第一个看到的目录是“.git”时,由于您将其作为异常处理,因此嵌套traverseDir也返回。
随时随地看视频慕课网APP

相关分类

Go
我要回答