我需要知道如何使用Go检测文件何时发生更改。我知道Unix提供了一个名为fcntl()的函数,它会在特定文件发生更改时发出通知,但我在Go中没有找到这个函数。请帮帮我。
发布于 2014-03-27 04:51:59
目前有一个实验性的包here。应该在go1.3中作为os/fsnotify合并到核心中
发布于 2011-11-26 02:17:42
我想补充一下peterSO的回答,如果你真的想读取由其他进程附加到文件中的数据-- tail程序在Unix中所做的那样--可能更好的做法是让tail自己完成监视文件的繁重工作,并使用它输出的内容。这可以通过使用exec包中的StdoutPipe函数运行tail来实现。
在我看来,使用tail来完成这类任务更可取,因为tail已经被教会了一堆聪明的技巧,包括检测文件替换(通常发生在监视日志文件被logrotate或类似的东西轮换时)。
发布于 2014-02-02 15:51:58
下面是一个简单的跨平台版本:
func watchFile(filePath string) error {
initialStat, err := os.Stat(filePath)
if err != nil {
return err
}
for {
stat, err := os.Stat(filePath)
if err != nil {
return err
}
if stat.Size() != initialStat.Size() || stat.ModTime() != initialStat.ModTime() {
break
}
time.Sleep(1 * time.Second)
}
return nil
}用法是这样的:
doneChan := make(chan bool)
go func(doneChan chan bool) {
defer func() {
doneChan <- true
}()
err := watchFile("/path/to/file")
if err != nil {
fmt.Println(err)
}
fmt.Println("File has been changed")
}(doneChan)
<-doneChan它的效率不如适当的系统调用,但它很简单,而且适用于任何地方,并且可能足以满足某些用途。
https://stackoverflow.com/questions/8270441
复制相似问题