Язык Go как обнаружить изменение файла?

Мне нужно знать, как определить, когда файл изменяется, используя Go. Я знаю, что Unix предоставляет функцию fcntl(), которая уведомляет, когда определенный файл изменен, но я не нашел такой функции в Go. Пожалуйста, помогите мне.

26
задан angelius 3 August 2016 в 06:08
поделиться

2 ответа

В настоящее время имеется экспериментальный пакет здесь . Он должен быть объединен с ядром как os/fsnotify в go1.3

9
ответ дан 28 November 2019 в 07:09
поделиться

Вот простая кроссплатформенная версия:

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

Не так эффективно, как правильный системный вызов, но это просто и работает везде и может быть достаточно для некоторых целей.

12
ответ дан 28 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: