2016-12-01 8 views
0

У меня возникли проблемы с отслеживанием файла для внесения изменений. Мне нужно знать, когда изменяется файл, и когда это произойдет, мне нужна новая строка, которая была добавлена. Я намереваюсь анализировать каждую строку и находить те, которые соответствуют определенным критериям, и воздействовать на информацию в этих строках. Я знаю ожидаемое количество совпадающих строк раньше времени, но я не знаю, сколько строк будет добавлено в файл или где будут совпадать строки.Монитор файла для дополнений и получения последней добавленной строки

Я пробовал 2 пакета до сих пор, безрезультатно.

fsnotify/fsnotify

Как фас, как я могу сказать, fsnotify могу только сказать мне когда файл изменен, не то, что детали модификации было. Поскольку мне нужно знать, что именно было добавлено в файл, это не хорошо для меня.

(В качестве побочного вопроса, это может быть запущена в цикле? Пример, который я попытался вышел после того, как только одна модификация. Я должен следить за нескольких модификаций.)

hpcloud/tail

Этот пакет пытается имитировать команду Unix tail, но у нее, похоже, есть свои проблемы. Результат, который я получаю, включает временные метки и другие данные - я просто хочу добавленную строку, ничего больше. Кроме того, кажется, что файл был изменен несколько раз, даже когда это всего лишь одно редактирование. Кроме того, здесь используется прерыватель транзакций, так как он не выводит последнюю строку, если строка не сопровождалась символом новой строки.

Делегирование в tail

я наткнулся this ответ, который наводит на мысль делегировать эту работу самой tail команды, но мне это нужно для работы кросс-платформенной (в частности, MacOS, Linux и Windows). Я не считаю, что эквивалентная команда существует в Windows.

Как мне решить эту проблему?

+1

Что случилось с дополнительной информацией от 'hpcloud/tail'? Вы все еще получаете прилагаемые данные. – JimB

+0

@JimB это не идеально, но я могу обойти его. Основная причина, по которой я не могу использовать 'hpcloud/tail', состоит в том, что она не выводит последнюю строку, если за ней не следует новая строка. – tverghis

+0

Вы можете, конечно, использовать fsnotify, тогда вы просто читаете файл по мере необходимости в зависимости от полученных уведомлений. Я не знаю более полного полного пакета «хвост -f», написанного на Go (но внеочередные рекомендации в любом случае отключены) – JimB

ответ

0

@ user2515526,

Обычно измененная разница выходит за рамки функциональных возможностей файловых Watchers', потому что, вы знаете, вы можете изменить изображение, и наблюдатель должен были бы постоянно отслеживать несколько Mb из диффа в памяти, и что, если у нас есть тысячи файлов? Однако, как бы плохо это ни звучало, это может быть именно так, как вы хотите реализовать это (конечно, зависит от вашего приложения и т. Д. - может быть хорошо для текстовых файлов), т. Е. Сохранение карты различий (1 diff per файл) с последней модификации. Не могу сказать, что мне это нравится, но похоже, что fsnotify не поддерживает изменения/различия, которые вам нужны.

Кроме того, что касается вашего вопроса о запуске в цикле, возможно, вы можете получить некоторые подсказки здесь: https://github.com/kataras/iris/blob/8370d76910cdd8de043753ed81ae080eae8dc798/utils/file.go Его структура, которая позволяет создавать сервер, который следит за изменениями файлов TypeScript. Так звучит похоже на ваш случай/вопрос.

Приветствия, -D