Beobachten Sie einen Ordner mithilfe von node.js auf Änderungen und drucken Sie Dateipfade, wenn sie geändert werden


85

Ich versuche, ein node.js-Skript zu schreiben, das nach Änderungen in einem Verzeichnis von Dateien sucht und dann die geänderten Dateien druckt. Wie kann ich dieses Skript so ändern, dass es ein Verzeichnis (anstelle einer einzelnen Datei) überwacht und die Namen der Dateien im Verzeichnis druckt, wenn sie geändert werden?

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?
});

Ich frage mich, ob dies relevant ist: stackoverflow.com/questions/12063266/… (Ich bin jedoch nicht mit Gruntjs vertraut - ich hoffe, es gibt andere Lösungen.)
Anderson Green

Vielleicht wäre so etwas wie Node-Inotify-Plusplus nützlich: stackoverflow.com/questions/5877263/…
Anderson Green

Welches Betriebssystem verwenden Sie? Dies ist wichtig, da die Mechanismen auf niedriger Ebene zum Anzeigen einer Datei sehr unterschiedlich sind, da Unix / Linux inotify, OSX FSWatchund ich keine Ahnung von Windoze haben, aber ich bin sicher, Google könnte es Ihnen sagen.
Srquinn

1
Obwohl ich ursprünglich die Ebene node-inotifyin meinem Projekt verwendet habe, bin ich schließlich zu gewechselt, node-inotify-plusplusdenn wer mag keine Abstraktionen? =)
srquinn

Antworten:


144

Versuchen Sie es mit Chokidar :

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 löst einige der plattformübergreifenden Probleme beim Betrachten von Dateien mit nur fs.


3
Behandelt es Unterordner?
Stepan

1
Ein Problem dabei - Wenn ich eine große Datei kopiere. Das Add-Ereignis wird sofort ausgelöst, und im Verlauf der Dateikopie werden Hunderte von Änderungsereignissen angezeigt. Gibt es eine Möglichkeit, nur ein Ereignis auszulösen, wenn die Dateikopie endet?
Curious101

4
@ Curious101, hast du versucht hinzuzufügen awaitWriteFinish: true? Es ist standardmäßig falsch.
cs_pupil

Ich möchte eine Frage stellen: Ist es wert, auf einem großen Dateisystem verwendet zu werden? Sie können sagen, ich möchte überwachen /home/terabyte. Nun, nicht rekursiv
tbhaxor

40

Warum nicht einfach das Alte benutzen fs.watch? Es ist ziemlich einfach.

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);
})

Weitere Informationen und Details zu den Optionen param finden Sie unter Node fs Docs


7
Hinweis zur Warnung: Ich habe dies auf meinem Mac getestet. Dieser Code erkennt nur diese Ordnerebene und keine Unterverzeichnisse für Änderungen. Fügen Sie daher unbedingt die Option hinzu, die rekursiv als zweiten Parameter angezeigt wird. siehe die oben verlinkten Dokumente
OzzyTheGiant

1
Hinweis zu @ OzzyTheGiant's Hinweis hinzugefügt: Die rekursive Option wird nur unter MacOS und Windows unterstützt.
Kaushik Evani

Node's fs.watch()ist etwas klobig, und Sie müssen Ihre Won-Debounce-Implementierung erstellen.
Mwieczorek

@mwieczorek Was bedeutet "entprellen"?
Thomas Jay Rush

2
@ThomasJayRush Ein Mechanismus, der eine bestimmte Zeitspanne zwischen und Ereignis und der Aktion zulässt. Wenn also ein Ereignis zweimal ausgelöst wird, wird die Aktion nur einmal aufgerufen. Es ist ein technischer Begriff, bei dem eine physikalische Taste elektrischen Strom auslösen würde, die Taste jedoch ein- oder mehrmals "abprallen" würde, wodurch mehrere Stromspitzen erzeugt würden, bei denen nur eine erwünscht war - was auch auf die Programmierung angewendet werden kann - insbesondere JS. medium.com/@jamischarles/what-is-debouncing-2505c0648ff1
mwieczorek

12

versuchen Sie Hund :

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()

Es wird ausgeführt, sobald die Datei geändert wurde

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.