使用fsnotify监视现有文件



我正在尝试使用golang中的fsnotify数据包监视文件。

我看到了一些这样的例子,我想知道这是否是使用fsnotify:

的最佳方式。
package main
import (
"log"
"github.com/howeyc/fsnotify"
)
func main() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
done := make(chan bool)
// Process events
go func() {
for {
select {
case ev := <-watcher.Event:
log.Println("event:", ev)
case err := <-watcher.Error:
log.Println("error:", err)
}
}
}()
err = watcher.Watch("testDir")
if err != nil {
log.Fatal(err)
}
<-done
var get_info := []string
get_info = read_file(path_to_file) 

watcher.Close()
}

基本上,我正在传递文件所在的路径,并在字符串变量中获得结果。

每次我更改文件时,我都想读取文件并获得结果。

我不确定我是否正确使用fsnotify基于那个例子。另外,我不确定应该将文件路径放在fsnotify中的哪个位置以监视该文件。

您非常正确地利用了fsnotify,唯一的变化可能是您希望利用通道获取事件,然后使用事件提取更改的文件名。这将允许您监视多个文件,并且在您的示例中,我不相信您曾经将值传递给done,以便它正确地完成通道上的等待并读取文件内容。

我在下面添加了一个简单的示例,它摆脱了go例程,只是监听主线程上的变化。


func main() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
panic(err)
}
err = watcher.Add("file.txt")
if err != nil {
panic(err)
}
for {
select {
case ev := <-watcher.Events:
log.Println("event:", ev)
if ev.Op&fsnotify.Write == fsnotify.Write {
contents, err := ioutil.ReadFile(ev.Name)
if err != nil {
// handle error
}
log.Println("modified file:", string(contents))
}
case err := <-watcher.Errors:
log.Println("error:", err)
}
}
}

最新更新