Мне нужно знать, как определить, когда файл изменяется с помощью Go. Я знаю, что Unix предоставляет функцию с именем fcntl()
, которая уведомляет об изменении конкретного файла, но я не нашел его в Go.
Пожалуйста, помогите мне.
Перейдите на другой язык, как изменить файл?
Ответ 1
В настоящее время существует экспериментальный пакет здесь. Он должен быть объединен с ядром как os/fsnotify
в go1.3
Ответ 2
Я бы добавил к peterSO ответ, что если вы действительно хотите прочитать данные, прикрепленные к файлу каким-либо другим процессом (процессами) — программа tail
в Unix, — вероятно, лучше просто сделать сам tail
, сделать сложную работу по мониторингу файла и потреблять то, что он выводит. Этого можно добиться, выполнив tail
с помощью функции StdoutPipe
из пакета exec.
Использование tail
для такого рода задач предпочтительнее в моих глазах, потому что tail
учат использовать кучу умных трюков, включая обнаружение замены файлов (обычно это происходит, когда один контролирует файл журнала, который поворачивается на logrotate или что-то подобное).
Ответ 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
Не так эффективно, как правильный системный вызов, но он прост и работает повсюду, и может быть достаточно для некоторых целей.
Ответ 4
Посмотрите https://github.com/howeyc/fsnotify. Он обертывает подсистему inotify ядра Linux и должен работать в Go1.
Ответ 5
По состоянию на Go1 inotify был удален из пакета. Посмотрите syscall пакет...
Пакет inotify реализует оболочку для Linux inotify система.