Monitor file and or directory

3

I have this method that reads the file

const fs = require('fs');
const path = require('path');

let arquivo = path.join(__dirname, 'arquivo.txt');

fs.readFile(arquivo, { encoding: 'utf-8' }, function(err, data) {
    if (!err) {
        // Retorna o conteúdo do arquivo.txt
        console.log(data);
    } else {
        // Retorna o erro
        console.log(err);
    }
});

I need to monitor any changes made to this file and / or directory and return the last change made, is it possible?

    
asked by anonymous 02.11.2017 / 12:27

1 answer

4

Update 1

Monitor files and directories using the node-watch library.

let watch = require('node-watch');
watch(['arquivo.txt', 'teste/', 'teste/arquivo.txt'], console.log);

See running on repl.it

Through the comments I found the package Chokidar and got the result.

const chokidar = require('chokidar');
const fs = require('fs');

let conteudo_anterior = '';
let arquivo = 'arquivo.txt';

// Faz a leitura inicial
fs.readFile(arquivo, { encoding: 'utf-8' }, function(err, data) {
    if (!err) {
        let linhas = data.trim().split('\n');
        // Retorna o conteúdo
        linhas.forEach(function(linha) {
            console.log(linha);
            conteudo_anterior = linha;
        });
    } else {
        // Retorna o erro
        console.log(err);
    }
});

// Monitora o arquivo
let watcher = chokidar.watch(arquivo, { persistent: true });
watcher.on('change', (path, stats) => {
    if (stats) {
        fs.readFile(path, { encoding: 'utf-8' }, function(err, data) {
            if (!err) {
                let linhas = data.trim().split('\n');
                // Última linha
                let ultima = linhas.slice(-1)[0];
                // Verifica se a linhas tem conteúdo.
                // Se tiver conteúdo e se o conteúdo é diferente do anterior, caso contrário nada faz.
                (ultima.length > 0 && ultima != conteudo_anterior) ? console.log(ultima) : '';
                conteudo_anterior = ultima;
            } else {
                // Retorna o erro
                console.log(err);
            }
        });
    }
});

    
02.11.2017 / 13:55