Node.js kullanarak değişiklikler için bir klasör izleyin ve değiştirildiklerinde dosya yollarını yazdırın


92

Bir dosya dizinindeki değişiklikleri izleyen ve ardından değiştirilen dosyaları yazdıran bir node.js betiği yazmaya çalışıyorum. Bu komut dosyasını, bir dizini izleyecek (tek bir dosya yerine) ve dizindeki dosyaların adlarını değiştirildikçe yazdıracak şekilde nasıl değiştirebilirim?

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

Bunun alakalı olup olmadığını merak ediyorum: stackoverflow.com/questions/12063266/… (Gruntjs'e aşina değilim, umarım başka çözümler de vardır.)
Anderson Green

Belki node-inotify-plusplus gibi bir şey yararlı olabilir: stackoverflow.com/questions/5877263/…
Anderson Green

Hangi işletim sistemini çalıştırıyorsunuz? Bir dosyayı izlemek için düşük seviyeli mekanizmalar, Unix / Linux'un kullandığı inotify, FSWatchOSX'in kullandığı ve Windoze hakkında hiçbir fikrim olmadığı için büyük ölçüde farklı olduğu için önemlidir, ancak eminim Google size söyleyebilir.
srquinn

1
Projemde aslen düzü kullanmama rağmen node-inotify, sonunda node-inotify-pluspluskim soyutlamaları sevmediği için geçiş yaptım ? =)
srquinn

Yanıtlar:


148

Chokidar'ı deneyin :

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, dosyaları yalnızca fs kullanarak izlemeyle ilgili bazı çapraz platform sorunlarını çözer.


3
Alt klasörleri işliyor mu?
Stepan Yakovenko

1
Bununla ilgili bir sorun - Büyük bir dosyayı kopyaladığımda. Add olayı hemen tetikleniyor ve ardından dosya kopyalama ilerledikçe yüzlerce değişiklik olayı alıyorum. Dosya kopyası bittiğinde yalnızca bir olay tetiklemenin bir yolu var mı?
Meraklı101

5
@ Curious101, eklemeyi denediniz awaitWriteFinish: truemi? Varsayılan olarak yanlıştır.
cs_pupil

Bir şey sormak istiyorum, büyük dosya sisteminde kullanmaya değer mi, izlemek istiyorum diyebilirsiniz /home/terabyte. Yinelemeli değil
tbhaxor

45

Neden sadece eskisini kullanmıyorsunuz fs.watch? Oldukça basit.

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

Seçenekler parametresi hakkında daha fazla bilgi ve ayrıntı için bkz. Düğüm fs Belgeleri


8
Uyarı notu, bunu Mac'imde test ettim ve bu kod yalnızca o klasör seviyesini algılar ve değişiklikler için herhangi bir alt dizini değil, bu nedenle ikinci parametre olarak yinelemeli izleme seçeneğini eklediğinizden emin olun; yukarıda bağlantılı belgelere bakın
OzzyTheGiant

1
@ OzzyTheGiant'ın Notuna Not Eklendi: Özyinelemeli seçeneği yalnızca macOS ve Windows'ta desteklenir.
Kaushik Evani

Düğümler fs.watch()biraz hantal ve kazandığınız geri çekilme uygulamanızı oluşturmanız gerekiyor.
mwieczorek

3
@ThomasJayRush, olay arasında belirli bir süre geçmesine ve eylemin gerçekleşmesine izin veren bir mekanizma, yani bir olay iki kez tetiklenirse, eylem yalnızca bir kez çağrılır. Bu, fiziksel bir düğmenin elektrik akımını tetikleyeceği bir mühendislik terimidir, ancak düğme bir veya daha fazla kez "sıçrayabilir" ve yalnızca birinin istendiği akımda birden fazla artış yaratır - bu da programlamaya da - özellikle JS'ye uygulanabilir. medium.com/@jamischarles/what-is-debouncing-2505c0648ff1
mwieczorek

1
Bu api platformlar arasında tutarlı olmadığından lütfen chokidar'ı kullanın.
Sandeep Gahlawat

12

tazı deneyin :

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

Dosya değiştiğinde çalıştırılacak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.