Мне нужно знать, как определить, когда файл изменяется, используя Go. Я знаю, что Unix предоставляет функцию fcntl()
, которая уведомляет, когда определенный файл изменен, но я не нашел такой функции в Go.
Пожалуйста, помогите мне.
В настоящее время имеется экспериментальный пакет здесь . Он должен быть объединен с ядром как os/fsnotify
в go1.3
Вот простая кроссплатформенная версия:
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
Не так эффективно, как правильный системный вызов, но это просто и работает везде и может быть достаточно для некоторых целей.