首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Go语言如何检测文件更改?

Go语言如何检测文件更改?
EN

Stack Overflow用户
提问于 2011-11-25 22:24:47
回答 5查看 25.4K关注 0票数 29

我需要知道如何使用Go检测文件何时发生更改。我知道Unix提供了一个名为fcntl()的函数,它会在特定文件发生更改时发出通知,但我在Go中没有找到这个函数。请帮帮我。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-27 04:51:59

目前有一个实验性的包here。应该在go1.3中作为os/fsnotify合并到核心中

票数 10
EN

Stack Overflow用户

发布于 2011-11-26 02:17:42

我想补充一下peterSO的回答,如果你真的想读取由其他进程附加到文件中的数据-- tail程序在Unix中所做的那样--可能更好的做法是让tail自己完成监视文件的繁重工作,并使用它输出的内容。这可以通过使用exec包中的StdoutPipe函数运行tail来实现。

在我看来,使用tail来完成这类任务更可取,因为tail已经被教会了一堆聪明的技巧,包括检测文件替换(通常发生在监视日志文件被logrotate或类似的东西轮换时)。

票数 17
EN

Stack Overflow用户

发布于 2014-02-02 15:51:58

下面是一个简单的跨平台版本:

代码语言:javascript
运行
复制
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
}

用法是这样的:

代码语言:javascript
运行
复制
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

它的效率不如适当的系统调用,但它很简单,而且适用于任何地方,并且可能足以满足某些用途。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8270441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档