перейти использовать fsnotify смотреть файл не работает - PullRequest
0 голосов
/ 12 мая 2019

Я использую библиотеку (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{}{}
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...