Soru Node.JS: “fs.watchFile” nasıl çalışır?


Göre Düğüm 0.4.3 için API dokümanlar, fs.watchFile(filename, [options], listener) işlevi olacak bir rutini başlatır

Değişikliklere dikkat et filename. callback dosyaya her erişildiğinde dinleyici çağrılır.

Ayrıca diyor

options eğer sağlanırsa, iki üye bir nesne içeren bir nesne olmalıdır. persistent, ve intervalmilisaniye cinsinden bir oylama değeri

Hangi aralıkta olduğunu göre her sık ​​sık kontrol edecek gösterir. Ama aynı zamanda diyor

Varsayılan { persistent: true, interval: 0 }.

Bu, dosya zamanının değişip değişmediğini görmek için her milisaniyeyi kontrol edeceği anlamına mı geliyor? OS seviye olaylarını dinler mi? Bu nasıl çalışıyor?


17
2018-03-22 16:33


Menşei


Bence bu bir kopyasıdır. stackoverflow.com/questions/4482352/... - Pero P.
Tjameson'un cevabı: Bir yinelenen olsa da, bu eski soruda verilen cevap eskidir. 2013 itibariyle, daha da fazla modern çözümün var olduğunu düşünüyorum. - Steven Lu
Node v6'da varsayılan değerdir. { persistent: true, interval: 5007 }. 0 aralığı mantıklı değildir. Sorunun sorulduğu zamanda bunun doğru olduğunu görünmüyor ama C kaynağındaki mevcut uygulama 0 ile 1 arasında değişir: ctx->interval = interval ? interval : 1;. - Nateowami


Cevaplar:


Evet, cpedros doğru, bu bir kopya gibi görünüyor. Sanırım buna biraz daha ışık tutabilirim.

Her işletim sisteminin işten kovulduğu kendi dosya değişikliği olayı vardır. Linux üzerinde, (eskiden dnotify olmak üzere) inotify, Mac üzerinde fsevents ve Windows'da FileSystemWatcher. Temel kodun her davayı ele alıp almadığından emin değilim, ama bu genel bir fikir.

Linux'ta bir dosya izlemek istiyorsanız, tavsiye ederim düğüm Inotify artı artı. Bir dizini izlemek istiyorsanız, inotify-plus-plus Düğüm-walk. Bunu hayata geçirdim ve bir çekicilik gibi çalıştı.

İlgilendiğiniz takdirde bazı kodları gönderebilirim. Düğüm-inotify-plus-plus'ın ardındaki güzellik, inotifiye olmanın nezaketinin çoğunu soyutlaması ve bir dosyadaki belirli olayları dinlemek için sezgisel bir API vermesidir.

EDIT: Bu, tonlarca dosyayı izlemek için kullanılmamalıdır. Benim sistemimde, max 8192'dir. Max'iniz bu komutu kullanarak bulunabilir. cat /proc/sys/fs/inotify/max_user_watches. Bu, yalnızca değişiklikler için dizinleri izlemek ve daha sonra tek tek dosyaları burada bulmak için kullanılabilir. Doğrudan bu dizinin altındaki bir dosya değiştirilmişse, değiştirilmiş bir olay tetiklenir.

DÜZENLEME: Dosyaların şu anda Windows üzerinde tam olarak desteklendiğine işaret etmek için @guiomie'ye teşekkürler. Bu v0.6.x sürümü ile olduğunu varsayalım.


12
2018-04-03 05:15



Bu Windows üzerinde Cygwin (unix emülatörü) üzerinde test ediliyor ve sonuçta Solaris'te kullanılacak. - George Bailey
Node.js yalnızca Linux üzerinde desteklendiğine inanıyorum, bu yüzden inotify'ın desteklenmediği bir tür yoklama yapmak olasıdır. - beatgammit
@tjameson Bunun ile tonlarca dosya veya klasör izlememeyi söylemiştiniz. Çok sayıda dosya veya klasör izlemek için daha uygun bir yöntem mi var? - funkyeah
@tjameson Dosya İzleme şu anda Windows'ta desteklenmektedir. - guiomie
@tjameson Varsa, node-inotify-pluspls ile node-walk'u nasıl entegre ettiğinizi gösteren küçük bir örnek gönderebilir misiniz lütfen :) - Carlton


Tjameson'un harika cevabını uzatmak için watchr Düğüm versiosn ve işletim sistemi farklılıkları arasında API normalleştirmek için. Ayrıca etkinlikler için unlink ve new sadece yerine changeyanı sıra dizin ağacı izlemek için destek ekler.


3
2018-04-19 03:44