@Pepsilike

Какой алгоритм работы модуля по логированию изменений файла?

Есть интересная задача: необходимо из файла A_file в директории A, прочитать первоначальные данные, сохранить их в некую локальную переменную. Затем повесить на этот файл некоторый watcher, который бы следил за изменением данного файла, при каждом изменении файла, следует снова прочитать данные и вывести в лог только изменения , по сравнению с последними данными.
В чем суть проблемы : первым делом я создал стрим на чтение с помощью метода 'fs.createReadStream', повесил watcher на файл с помощью 'fs.watch' , затем через другой stream пишу в этот файл какие-то данные (ну или просто через блокнот), так вот при наступлении события 'change' я никак не могу понять, как перечитать файл заново, мой созданный ранее stream якобы уже закрыт. Мне кажется я что-то не так делаю в корне.
  • Вопрос задан
  • 282 просмотра
Решения вопроса 2
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
А стрим тут и не нужен, делайте fs.readFile, потом ставьте fs.watch и при изменении fs.readFile в другую переменную и сравнивайте, только нужно создать еще очередь сравниваний, потому, что файл может меняться чаще, чем закончится предыдущее сравнивание (но это чисто теоретически, если по специфике задачи известно, что он меняется с малой периодичностью, то это можно и опустить). Результат fs.readFile это объект Buffer, для сравнения двух буферов, скорее всего, если они содержат текст их можно перегнать в строки .toString() и парсить. А вот понять, идентичны ли буферы, можно при помощи Buffer.compare(buf1, buf2).
Ответ написан
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
Вроде логично, что stream закрыт. Вы же не можете держать FileDescriptor открытым для одновременной записи и чтения двумя процессами. Это неконсистентно. Потом держать файл в памяти просто как dump пожалуй дороговато, наверное разумней хранить dump в файловой системе(если у вас журналирующая файловая система, то она сама все сделает). Посчитать изменения проще всего gnu-utill коммандой diff или ищите библиотеки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы