监控Golang中的文件更改

监控Golang中的文件更改,go,Go,我试图监视一个不断更新的文件(还有另一个进程在它后面附加行)。我已经实现了下面的golang代码,它打印了更新后添加到文件中的新行,但有时没有检测到新的附加行。有人知道问题出在哪里吗 非常感谢 package main import ( "bufio" "fmt" "io" "os" "log" "time" ) func Monitor(file

我试图监视一个不断更新的文件(还有另一个进程在它后面附加行)。我已经实现了下面的golang代码,它打印了更新后添加到文件中的新行,但有时没有检测到新的附加行。有人知道问题出在哪里吗

非常感谢

package main

import (
  "bufio"
  "fmt"
  "io"
  "os"
  "log"
  "time"
)

func Monitor(file *os.File) chan string {

    changes := make(chan string)

    file.Seek(0, os.SEEK_END)
    bf := bufio.NewReader(file)

    go func() {
        for {
            line, _, err := bf.ReadLine()
            if len(line) != 0 {
                changes <- string(line)
            } else if err != io.EOF {
                time.Sleep(10 * time.Millisecond)
            }
        }

        close(changes)
    }()

    return changes
}

func main() {

    file_name := "file.txt"
    file, err := os.Open(file_name)
    if err != nil {
      log.Fatalf("openFile: %s", err)
    }


    for {
        changes := Monitor(file)
        msg := <-changes
        fmt.Println(msg)
    }

    defer file.Close()

}
主程序包
进口(
“布菲奥”
“fmt”
“io”
“操作系统”
“日志”
“时间”
)
func监视器(文件*os.file)chan字符串{
更改:=生成(更改字符串)
file.Seek(0,os.Seek_END)
bf:=bufio.NewReader(文件)
go func(){
为了{
第行,u,err:=bf.ReadLine()
如果len(line)!=0{

更改这里有很多问题,我怀疑它们组合在一起会造成相当混乱的行为。您只想在看到
io.EOF
时睡觉,而不想看到任何其他错误。关闭
changes
频道在这里没有任何作用。您正在每行之后调度另一个
Monitor
goroutine,这会增加越来越多的文件读取器争先恐后地读取输入并丢弃行。使用
defer
的目的是将调用放在原点附近,没有理由
defer file.Close()
在函数的末尾。我明白了…但是我如何设置一个
监视器来查找文件更改,而不关闭并重新打开文件?非常感谢您的回答!!但是您没有关闭并重新打开文件,每个
监视器
goroutine继续运行,只需调用一次即可。很好!现在它按预期工作!M谢谢你的更正:)还要注意,在大多数现代操作系统中都有可用的接口。