Следите за изменениями в папке с помощью node.js и печатайте пути к файлам при их изменении.

Я пытаюсь написать скрипт node.js, который отслеживает изменения в каталоге файлов, а затем печатает измененные файлы. Как я могу изменить этот скрипт, чтобы он следил за каталогом (а не за отдельным файлом) и печатал имена файлов в каталоге по мере их изменения?

var fs = require('fs'),
    sys = require('sys');
var file = '/home/anderson/Desktop/fractal.png'; //this watches a file, but I want to watch a directory instead
fs.watchFile(file, function(curr, prev) {
    alert("File was modified."); //is there some way to print the names of the files in the directory as they are modified?
});

person Anderson Green    schedule 04.12.2012    source источник
comment
Интересно, актуально ли это: stackoverflow.com/questions/12063266/ (хотя я не знаком с gruntjs - Надеюсь, есть другие решения.)   -  person Anderson Green    schedule 04.12.2012
comment
Возможно, будет полезно что-то вроде node-inotify-plusplus: stackoverflow.com/questions/5877263/   -  person Anderson Green    schedule 04.12.2012
comment
Какую ОС вы используете? Это важно, так как механизмы низкого уровня для просмотра файла сильно различаются, поскольку Unix/Linux использует inotify, OSX использует FSWatch, и я понятия не имею о Windoze, но я уверен, что Google может вам сказать.   -  person srquinn    schedule 04.12.2012
comment
Хотя изначально я использовал в своем проекте простое node-inotify, в конце концов я переключился на node-inotify-plusplus, потому что кто не любит абстракции? знак равно   -  person srquinn    schedule 04.12.2012


Ответы (3)


Попробуйте Чокидар:

var chokidar = require('chokidar');

var watcher = chokidar.watch('file or dir', {ignored: /^\./, persistent: true});

watcher
  .on('add', function(path) {console.log('File', path, 'has been added');})
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.error('Error happened', error);})

Chokidar решает некоторые кроссплатформенные проблемы с просмотром файлов, используя только fs.

person mtsr    schedule 04.12.2012
comment
Обрабатывает ли он подпапки? - person Stepan Yakovenko; 16.02.2017
comment
Одна проблема с этим - когда я копирую большой файл. Событие добавления запускается немедленно, а затем я получаю сотни событий изменения по мере выполнения копирования файла. Любой способ вызвать только одно событие, когда копия файла заканчивается? - person Curious101; 11.04.2019
comment
@Curious101, вы пробовали добавить awaitWriteFinish: true? По умолчанию это ложь. - person cs_pupil; 12.04.2019
comment
Я хочу спросить одну вещь, стоит ли использовать на большой файловой системе, вы можете сказать, что я хочу контролировать /home/terabyte. Ну не рекурсивно - person tbhaxor; 28.05.2019

Почему бы просто не использовать старый fs.watch? Это довольно просто.

fs.watch('/path/to/folder', (eventType, filename) => {
console.log(eventType);
// could be either 'rename' or 'change'. new file event and delete
// also generally emit 'rename'
console.log(filename);
})

Дополнительные сведения и сведения о параметре options см. в Документации Node fs.

person Kaushik Evani    schedule 16.06.2017
comment
Предупреждение: я тестировал это на своем Mac, и этот код обнаруживает только этот уровень папки, а не какие-либо подкаталоги для изменений, поэтому обязательно добавьте параметр для рекурсивного просмотра в качестве второго параметра; см. документы, указанные выше - person OzzyTheGiant; 23.11.2017
comment
Добавлено примечание к примечанию @OzzyTheGiant: рекурсивный параметр поддерживается только в macOS и Windows. - person Kaushik Evani; 24.11.2017
comment
Node fs.watch() немного неуклюж, и вам нужно создать собственную реализацию устранения дребезга. - person mwieczorek; 21.04.2018
comment
@mwieczorek Что означает «отказ от дребезга»? - person Thomas Jay Rush; 10.12.2019
comment
@ThomasJayRush — механизм, который позволяет пройти определенное время между событием и выполнением действия, поэтому, если событие срабатывает дважды, действие вызывается только один раз. Это технический термин, когда физическая кнопка запускает электрический ток, но кнопка отскакивает один или несколько раз, создавая несколько всплесков тока там, где нужен только один, что также можно применить к программированию, особенно к JS. medium.com/@jamischarles/what-is-debouncing-2505c0648ff1 - person mwieczorek; 12.12.2019
comment
пожалуйста, используйте chokidar, так как этот API несовместим на разных платформах. - person Sandeep Gahlawat; 09.12.2020

попробуйте hound:

hound = require('hound')

// Create a directory tree watcher.
watcher = hound.watch('/tmp')

// Create a file watcher.
watcher = hound.watch('/tmp/file.txt')

// Add callbacks for file and directory events.  The change event only applies
// to files.
watcher.on('create', function(file, stats) {
  console.log(file + ' was created')
})
watcher.on('change', function(file, stats) {
  console.log(file + ' was changed')
})
watcher.on('delete', function(file) {
  console.log(file + ' was deleted')
})

// Unwatch specific files or directories.
watcher.unwatch('/tmp/another_file')

// Unwatch all watched files and directories.
watcher.clear()

Он будет выполняться после изменения файла

person Sharathi RB    schedule 23.10.2014