监控Golang中的文件更改
我试图监视一个不断更新的文件(还有另一个进程在它后面附加行)。我已经实现了下面的golang代码,它打印了更新后添加到文件中的新行,但有时没有检测到新的附加行。有人知道问题出在哪里吗 非常感谢监控Golang中的文件更改,go,Go,我试图监视一个不断更新的文件(还有另一个进程在它后面附加行)。我已经实现了下面的golang代码,它打印了更新后添加到文件中的新行,但有时没有检测到新的附加行。有人知道问题出在哪里吗 非常感谢 package main import ( "bufio" "fmt" "io" "os" "log" "time" ) func Monitor(file
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谢谢你的更正:)还要注意,在大多数现代操作系统中都有可用的接口。