node.jsはどうやってファイルの変化を監視しますか?
fs.FSS Watch
fs.FSI Watch類はEventEmitterを継承し、ファイルの変化を監視するために使用され、fs.watchを呼び出してからfs.FSF Watchの例を返します。監視するファイルを指定するたびに修正されると、インスタンスはイベントをトリガしてコールバック関数を呼び出します。
1.filename:ファイルまたはフォルダパス
2.options encoding recursive:デフォルト値falseは、すべてのサブディレクトリを監視するべきか、それとも現在のディレクトリだけを監視するべきか、macOSとWindowsだけで をサポートします。 persistent:デフォルト値trueは、ファイルが監視されている場合、プロセスは を実行し続けるべきかどうかを示しています。 listener(eventType、filename):ファイル変化コール機能
eventTypeは主に
1.filename
2.options bitginnit:デフォルト値false、コールバックstatの値がbiginnitタイプ かどうかを指定します。 persistent:デフォルト値true、ファイルが監視されている時、プロセスは を実行し続けるべきですか? interval:デフォルト値5007は、ポーリング頻度(ms)を指定するために使用されます。
3.listener(currentStats、previous Stats):listenerは二つのパラメータがあり、現在のstatオブジェクトと前のstatオブジェクトがあります。
ファイルの変更時に通知を受けるには
fs.watch File()は輪訓方式でファイルの変化を検出しますので、
fs.watch()はオペレーティングシステムから提供されたイベントを監聴して、しかもディレクトリの変化を監視して、fs.watch()を使ってfs.watFileよりもっと効率的で、普段はできるだけfs.watch()を使ってfs.watch Fileの代わりに使うべきです。
もちろんfs.watch()はオペレーティングシステムの実現に依存しています。プラットフォームによって表現が違います。 Linuxオペレーティングシステムはinotify を使用する。は、macOSシステムでFEvents を使用する。ウィンドウズシステムでReadDirectoryChangesW を使用します。
fs.unwatch File
fs.watch File()の性能問題、fs.watch()のプラットフォームが一致しないなどの二つの方法はいずれも気に入らないところがあります。
Node.js
MacOSはfilenameを提供しない場合があります。
一部のシーンでは修正イベントが発生しません(MacOS Sublime)
頻繁に2回トリガーイベントを修正します。
ほとんどのファイルの変更はeventTypeがrenameです。
簡単な監視ファイルツリー方式が提供されていません。
Node.js
事件の処理問題はfs.watchと同じです。
ネストした待ち受けがありません
CPUの消耗が大きい
https://www.npmjs.com/package/chokidar
日常的にファイルの変化を監視してコミュニティの優秀な方案を選ぶことができます。 node-watch チョキダ
fs.FSI Watch類はEventEmitterを継承し、ファイルの変化を監視するために使用され、fs.watchを呼び出してからfs.FSF Watchの例を返します。監視するファイルを指定するたびに修正されると、インスタンスはイベントをトリガしてコールバック関数を呼び出します。
fs.watch('./tmp', (eventType, filename) => {
if (filename) {
console.log(filename);
}
});
fs.ウォッチ()fs.watch(filename[, options][, listener])
ファイルの変化を監視し、fs.FSI Watchの例を返す。1.filename:ファイルまたはフォルダパス
2.options
rename
とchange
であり、ほとんどのプラットフォームにおいて、ファイルがディレクトリ内に出現または消失したときに「rename」イベントをトリガし、Windows上で監視されているディレクトリが移動されたり名前が変更されたりしたら、何のイベントもトリガされず、監視されているディレクトリが削除されたときに、EPERM
エラーが報告される。
fs.watch('./', { recursive: true }, (eventType, filename) => {
console.log(eventType, filename);
});
fs.watch File()fs.watchFile(filename[, options], listener)
は、ファイルの変化を監視するために使用されます。1.filename
2.options
ファイルの変更時に通知を受けるには
curr.mtime
とprev.mtime
を比較する必要があります。
const fs = require('fs');
fs.watchFile('./test.txt', { interval: 100 }, (curr, prev) => {
console.log(' : ' + curr.mtime);
console.log(' : ' + prev.mtime);
});
const tid = setInterval(() => {
fs.appendFile('./test.txt', 'Hello, world!
', err => {
if (err) throw err;
console.log(' ');
});
}, 300);
setTimeout(() => {
clearInterval(tid);
fs.unwatchFile('./test.txt');
}, 2000);
fs.watch()とfs.watch File()fs.watch File()は輪訓方式でファイルの変化を検出しますので、
interval
を設置しないか、高い値を設定しないとファイルの変化の監視が遅れています。fs.watch()はオペレーティングシステムから提供されたイベントを監聴して、しかもディレクトリの変化を監視して、fs.watch()を使ってfs.watFileよりもっと効率的で、普段はできるだけfs.watch()を使ってfs.watch Fileの代わりに使うべきです。
もちろんfs.watch()はオペレーティングシステムの実現に依存しています。プラットフォームによって表現が違います。
fs.unwatch File
fs.unwatchFile(filename[, listener])
は、filenameの変化を監視し、listenerを指定すると、この特定のモニターだけを除去します。そうでないと、すべてのモニターを削除して、filenameの監視を停止します。fs.unwatchFile('./test.txt');
コミュニティの選択fs.watch File()の性能問題、fs.watch()のプラットフォームが一致しないなどの二つの方法はいずれも気に入らないところがあります。
Node.js
fs.watch
:MacOSはfilenameを提供しない場合があります。
一部のシーンでは修正イベントが発生しません(MacOS Sublime)
頻繁に2回トリガーイベントを修正します。
ほとんどのファイルの変更はeventTypeがrenameです。
簡単な監視ファイルツリー方式が提供されていません。
Node.js
fs.watchFile
:事件の処理問題はfs.watchと同じです。
ネストした待ち受けがありません
CPUの消耗が大きい
https://www.npmjs.com/package/chokidar
日常的にファイルの変化を監視してコミュニティの優秀な方案を選ぶことができます。
const chokidar = require('chokidar');
// One-liner for current directory
chokidar.watch('.').on('all', (event, path) => {
console.log(event, path);
});
// Initialize watcher.
const watcher = chokidar.watch('file, dir, glob, or array', {
ignored: /(^|[\/\\])\../, // ignore dotfiles
persistent: true
});
// Something to use when events are received.
const log = console.log.bind(console);
// Add event listeners.
watcher
.on('add', path => log(`File ${path} has been added`))
.on('change', path => log(`File ${path} has been changed`))
.on('unlink', path => log(`File ${path} has been removed`));
// More possible events.
watcher
.on('addDir', path => log(`Directory ${path} has been added`))
.on('unlinkDir', path => log(`Directory ${path} has been removed`))
.on('error', error => log(`Watcher error: ${error}`))
.on('ready', () => log('Initial scan complete. Ready for changes'))
.on('raw', (event, path, details) => { // internal
log('Raw event info:', event, path, details);
});
以上はnode.jsがどのようにファイルの変化の詳しい内容を監視しますか?