您好,登錄后才能下訂單哦!
小編給大家分享一下Node.js如何監(jiān)視文件變化,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
fs.FSWatcher類 繼承了 EventEmitter,用于監(jiān)視文件變化,調用 fs.watch 后返回一個 fs.FSWatcher 實例,每當指定監(jiān)視的文件被修改時,實例會觸發(fā)事件調用回調函數(shù)
fs.watch('./tmp', (eventType, filename) => { if (filename) { console.log(filename); } });
fs.watch(filename[, options][, listener])
監(jiān)視文件變化,返回 fs.FSWatcher 實例
1、filename:文件或文件夾路徑
2、options
eventType 主要是 rename
和 change
,在大多數(shù)平臺上,文件在目錄中出現(xiàn)或消失時觸發(fā) 'rename' 事件,在 Windows 上,如果監(jiān)視的目錄被移動或重命名,則不會觸發(fā)任何事件,當監(jiān)視的目錄被刪除時,則報告 EPERM
錯誤
fs.watch('./', { recursive: true }, (eventType, filename) => { console.log(eventType, filename); });
fs.watchFile(filename[, options], listener)
用于監(jiān)視文件變化
1、filename
2、options
3、listener(currentStats, previousStats):listener 有兩個參數(shù),當前的 stat 對象和之前的 stat 對象
要在修改文件時收到通知,則需要比較 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!\n', err => { if (err) throw err; console.log('文件修改完成'); }); }, 300); setTimeout(() => { clearInterval(tid); fs.unwatchFile('./test.txt'); }, 2000);
因為 fs.watchFile() 使用輪訓方式檢測文件變化,如果不設置 interval
或者設置較高的值會發(fā)現(xiàn)文件變化的監(jiān)視有延遲
而 fs.watch() 監(jiān)聽操作系統(tǒng)提供的事件,而且可以監(jiān)視目錄變化,使用 fs.watch() 比 fs.watchFile() 更高效,平常應盡可能使用 fs.watch() 代替 fs.watchFile()
當然 fs.watch() 依賴操作系統(tǒng)的實現(xiàn),在不同平臺上表現(xiàn)會有差異
Linux 操作系統(tǒng)使用 inotify
在 macOS 系統(tǒng)使用 FSEvents
在 windows 系統(tǒng)使用 ReadDirectoryChangesW
fs.unwatchFile(filename[, listener])
停止監(jiān)視 filename 的變化,如果指定了 listener,則僅移除此特定監(jiān)聽器,否則將移除所有監(jiān)聽器,從而停止監(jiān)視 filename
fs.unwatchFile('./test.txt');
fs.watchFile() 性能問題,fs.watch() 平臺不一致等兩個方法都有不盡如人意的地方
Node.js
fs.watch
:
- MacOS 有時候不提供
filename
- 在部分場景不觸發(fā)修改事件(MacOS Sublime)
- 經常一次修改兩次觸發(fā)事件
- 大部分文件變化 eventType 都是
rename
.- 未提供簡單的監(jiān)視文件樹方式
Node.js fs.watchFile
:
- 事件處理問題和 fs.watch 一樣爛
- 沒有嵌套監(jiān)聽
- CPU 消耗大
https://www.npmjs.com/package/chokidar
日常在監(jiān)視文件變化可以選擇社區(qū)的優(yōu)秀方案
node-watch
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如何監(jiān)視文件變化有了一定的了解,想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。