Подтвердить что ты не робот

Перейдите на другой язык, как изменить файл?

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

4b9b3361

Ответ 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 система.