去使用fsnotify监视文件已更改不起作用

时间:2019-05-12 01:43:53

标签: go

我使用库(http://github.com/fsnotify/fsnotify)监视文件系统。

我正在尝试调整存储库示例以符合我的要求,但是当我这样做时,该程序将无法正常工作。

我在ExampleNewWatcher函数中评论了完成的频道

done := make(chan bool)
<-done

结果,现在,当我运行示例时,此通道不再输出任何内容。

event, ok := <-watcher.Events

完整代码:

package main

import (
    "github.com/fsnotify/fsnotify"
    "log"
    "os"
    "strconv"
    "time"
)

func ExampleNewWatcher() {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    done := make(chan bool) // if i commen this line the `panic` not norking
    go func() {
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                log.Println("event:", event)
                if event.Op&fsnotify.Write == fsnotify.Write {
                    log.Println("modified file:", event.Name)
                }
                panic("just for test") // new output this line

            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Println("error:", err)
            }
        }
    }()

    err = watcher.Add("/tmp/foo")
    if err != nil {
        log.Fatal(err)
    }
   <-done // comment this
}

func check(err error) {
    if err != nil {
        panic(err)
    }

}
func main() {
    // create the test file
    var err error
    file, err := os.Create("/tmp/foo")
    check(err)

    _, err = file.Write([]byte("hello world"))
    check(err)

    stopchan := make(chan struct{})

    // test change file
    go func() {

        for i := 0; i < 10; i++ {
            file1, err := os.OpenFile("/tmp/foo", os.O_RDWR, 0644)
            check(err)
            d := strconv.Itoa(i) + "hello world"
            _, err = file1.Write([]byte(d))
            check(err)
            err = file1.Close()
            check(err)
            time.Sleep(2 * time.Second) // wait the context  writed to the file
        }

    }()

    ExampleNewWatcher() // monitor file

    stopchan <- struct{}{}
}

0 个答案:

没有答案