Перейти язык, как обнаружить изменение файла? - PullRequest
25 голосов
/ 25 ноября 2011

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

Ответы [ 5 ]

13 голосов
/ 25 ноября 2011

Я бы добавил к ответу peterSO , что если вы действительно хотите прочитать данные, добавленные в файл каким-либо другим процессом (-ами) - что такое tailПрограмма работает в Unix, - вероятно, лучше просто заставить tail сама выполнять сложную работу по мониторингу файла и потреблять то, что он выводит.Это может быть достигнуто путем запуска tail с использованием функции StdoutPipe из пакета exec .

Использование tail для такого рода задач предпочтительнее, на мой взгляд, поскольку tailнаучили использовать кучу хитрых приемов, включая обнаружение замен файлов (обычно это происходит, когда кто-то отслеживает файл журнала, который вращается с помощью logrotate или чего-то подобного).

11 голосов
/ 02 февраля 2014

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

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

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

9 голосов
/ 27 марта 2014

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

8 голосов
/ 03 октября 2012

Взгляните на https://github.com/howeyc/fsnotify. Обертка подсистемы inotify ядра Linux и должна работать в Go1.

6 голосов
/ 25 ноября 2011

По состоянию на Go1 inotify удалено из пакета. Посмотрите на пакет syscall сейчас ...

Пакет inotify реализует оболочку для Linux inotify система.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...