中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用node.js 如何實現一個監視文件變化功能

發布時間:2020-11-05 17:57:16 來源:億速云 閱讀:170 作者:Leah 欄目:開發技術

本篇文章為大家展示了使用node.js 如何實現一個監視文件變化功能,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

fs.FSWatcher

fs.FSWatcher類 繼承了 EventEmitter,用于監視文件變化,調用 fs.watch 后返回一個 fs.FSWatcher 實例,每當指定監視的文件被修改時,實例會觸發事件調用回調函數

fs.watch('./tmp', (eventType, filename) => {
 if (filename) {
  console.log(filename);
 }
});

fs.watch()

fs.watch(filename[, options][, listener]) 監視文件變化,返回 fs.FSWatcher 實例

1.filename:文件或文件夾路徑

2.options

  • encoding
  • recursive:默認值 false,應該監視所有子目錄,還是僅監視當前目錄,僅在 macOS 和 Windows 上支持
  • persistent:默認值 true,指示如果文件已正被監視,進程是否應繼續運行
  • listener(eventType, filename):文件變化回調函數
     

eventType 主要是 renamechange ,在大多數平臺上,文件在目錄中出現或消失時觸發 'rename' 事件,在 Windows 上,如果監視的目錄被移動或重命名,則不會觸發任何事件,當監視的目錄被刪除時,則報告 EPERM 錯誤

fs.watch('./', { recursive: true }, (eventType, filename) => {
 console.log(eventType, filename);
});

fs.watchFile()

fs.watchFile(filename[, options], listener) 用于監視文件變化

1.filename

2.options

  • biginit:默認值 false,指定回調 stat 中的數值是否為 biginit 類型
  • persistent:默認值 true,當文件正在被監視時,進程是否應該繼續運行
  • interval:默認值 5007,用來指定輪詢頻率(ms)
     

3.listener(currentStats, previousStats):listener 有兩個參數,當前的 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.watch() 與 fs.watchFile()

因為 fs.watchFile() 使用輪訓方式檢測文件變化,如果不設置 interval 或者設置較高的值會發現文件變化的監視有延遲
而 fs.watch() 監聽操作系統提供的事件,而且可以監視目錄變化,使用 fs.watch() 比 fs.watchFile() 更高效,平常應盡可能使用 fs.watch() 代替 fs.watchFile()

當然 fs.watch() 依賴操作系統的實現,在不同平臺上表現會有差異

  • Linux 操作系統使用 inotify
  • 在 macOS 系統使用 FSEvents
  • 在 windows 系統使用 ReadDirectoryChangesW

fs.unwatchFile

fs.unwatchFile(filename[, listener]) 停止監視 filename 的變化,如果指定了 listener,則僅移除此特定監聽器,否則將移除所有監聽器,從而停止監視 filename

fs.unwatchFile('./test.txt');

社區選擇

fs.watchFile() 性能問題,fs.watch() 平臺不一致等兩個方法都有不盡如人意的地方

Node.js fs.watch:

MacOS 有時候不提供 filename
在部分場景不觸發修改事件(MacOS Sublime)
經常一次修改兩次觸發事件
大部分文件變化 eventType 都是 rename.
未提供簡單的監視文件樹方式

Node.js fs.watchFile:

事件處理問題和 fs.watch 一樣爛
沒有嵌套監聽
CPU 消耗大

https://www.npmjs.com/package/chokidar

日常在監視文件變化可以選擇社區的優秀方案

  1. node-watch
  2. 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 如何實現一個監視文件變化功能,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

垦利县| 钟山县| 渝中区| 内乡县| 莱州市| 邵阳市| 兴安盟| 彰武县| 永昌县| 内乡县| 江津市| 新巴尔虎右旗| 清涧县| 亚东县| 镇赉县| 崇信县| 淳化县| 巴林右旗| 景德镇市| 平塘县| 绥江县| 兴化市| 东山县| 慈溪市| 寻甸| 陈巴尔虎旗| 浙江省| 耒阳市| 菏泽市| 土默特右旗| 济阳县| 寿阳县| 德令哈市| 平定县| 崇义县| 盐源县| 安吉县| 万全县| 甘洛县| 灵石县| 合江县|