1

Коллеги, у меня есть такая функция,

const getFiles = (dir, files_) => {
  files_ = files_ || [];
  let files = fs.readdirSync(dir);
  for (var i in files) {
    var name = dir + '/' + files[i];
    if (fs.statSync(name).isDirectory()) {
      getFiles(name, files_);
    } else {
      files_.push(name);
    }
  }
  return files_;
};

console.log(getFiles('./frontend/multimedia/image'));

которая прекрасно работает, но как мне данной функции указать, чтобы она отслеживала за изменениями содержимым в папке (удаление или добавление файлов)?

Единственно, что пришло в голову это запускать getFiles('./frontend/multimedia/image') в setInterval().

Понимаю, что это - не самый лучший способ...

Так как же мне не перезапускать эту функцию, а реализовать в ней отслеживание за папкой?

nörbörnën
  • 12,192
  • 5
  • 29
  • 40
Air
  • 14,505

1 Answers1

2

В nodejs есть стандартные средства для отслеживания изменений файла или каталога.

fs.watch(filename[, options][, listener])

const fs = require('fs');

const w = fs.watch( process.cwd(), { recursive: true }, (eventType, filename) => { console.log('listener', eventType, filename); } );

w.on('change', (eventType, filename) => { console.log('[h] change', eventType, filename); }); w.on('error', (err) => console.error('[h] error', err)); w.on('close', () => console.log('[h] close'));

Вывод в консоль:

$ node src/fs-watch-1/index.js 
rename tmp
rename tmp/q
rename tmp/.#q2
rename tmp/q2
rename tmp/.#q2
rename tmp/q
rename tmp
rename tmp1

Ими можно пользоваться, однако callback-и получают только два типа событий eventType - 'rename' либо 'change'. И не на всех типах операционных систем получают имя модифицированного файла.

В общем, для решения задачи "отслеживать удаление или добавление файлов", селективность инструмента низкая и прийдётся руками дописывать проверки.


Рекомендую использовать пакет chokidar. С ним задача решается легко:

const chokidar = require('chokidar');

const watcher = chokidar.watch(process.cwd(), { persistent: true }); watcher.on('ready', () => { watcher.on('add', (path) => console.log(File ${path} has been added)) .on('unlink', (path) => console.log(File ${path} has been removed)) .on('addDir', (path) => console.log(Directory ${path} has been added)) .on('unlinkDir', (path) => console.log(Directory ${path} has been removed)); });

Вывод в консоль:

$ node src/fs-watch-1/chokidar.js 
File /Users/xxx/git/stackoverflow-practice/tmp/q3 has been removed
File /Users/xxx/git/stackoverflow-practice/tmp/q1 has been removed
File /Users/xxx/git/stackoverflow-practice/tmp/q2 has been removed
Directory /Users/xxx/git/stackoverflow-practice/tmp has been removed

Directory /Users/xxx/git/stackoverflow-practice/tmp has been added File /Users/xxx/git/stackoverflow-practice/tmp/q has been added

nörbörnën
  • 12,192
  • 5
  • 29
  • 40