真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Node.js如何監(jiān)視文件變化

小編給大家分享一下Node.js如何監(jiān)視文件變化,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)公司專注于淶源企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城建設(shè)。淶源網(wǎng)站建設(shè)公司,為淶源等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

fs.FSWatcher

fs.FSWatcher類 繼承了 EventEmitter,用于監(jiān)視文件變化,調(diào)用 fs.watch 后返回一個 fs.FSWatcher 實例,每當(dāng)指定監(jiān)視的文件被修改時,實例會觸發(fā)事件調(diào)用回調(diào)函數(shù)

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

fs.watch()

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

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

2、options

  • encoding
  • recursive:默認(rèn)值 false,應(yīng)該監(jiān)視所有子目錄,還是僅監(jiān)視當(dāng)前目錄,僅在 macOS 和 Windows 上支持
  • persistent:默認(rèn)值 true,指示如果文件已正被監(jiān)視,進(jìn)程是否應(yīng)繼續(xù)運行
  • listener(eventType, filename):文件變化回調(diào)函數(shù)

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

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

fs.watchFile()

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

1、filename

2、options

  • biginit:默認(rèn)值 false,指定回調(diào) stat 中的數(shù)值是否為 biginit 類型
  • persistent:默認(rèn)值 true,當(dāng)文件正在被監(jiān)視時,進(jìn)程是否應(yīng)該繼續(xù)運行
  • interval:默認(rèn)值 5007,用來指定輪詢頻率(ms)

3、listener(currentStats, previousStats):listener 有兩個參數(shù),當(dāng)前的 stat 對象和之前的 stat 對象

要在修改文件時收到通知,則需要比較 curr.mtimeprev.mtime

const fs = require('fs');

fs.watchFile('./test.txt', { interval: 100 }, (curr, prev) => {
  console.log('當(dāng)前的最近修改時間是: ' + 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() 使用輪訓(xùn)方式檢測文件變化,如果不設(shè)置 interval 或者設(shè)置較高的值會發(fā)現(xiàn)文件變化的監(jiān)視有延遲
而 fs.watch() 監(jiān)聽操作系統(tǒng)提供的事件,而且可以監(jiān)視目錄變化,使用 fs.watch() 比 fs.watchFile() 更高效,平常應(yīng)盡可能使用 fs.watch() 代替 fs.watchFile()

當(dāng)然 fs.watch() 依賴操作系統(tǒng)的實現(xiàn),在不同平臺上表現(xiàn)會有差異

  • Linux 操作系統(tǒng)使用 inotify

  • 在 macOS 系統(tǒng)使用 FSEvents

  • 在 windows 系統(tǒng)使用 ReadDirectoryChangesW

fs.unwatchFile

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

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

社區(qū)選擇

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

Node.js fs.watch:

  • MacOS 有時候不提供 filename
  • 在部分場景不觸發(fā)修改事件(MacOS Sublime)
  • 經(jīng)常一次修改兩次觸發(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)視文件變化有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)站題目:Node.js如何監(jiān)視文件變化
當(dāng)前路徑:http://weahome.cn/article/igiseh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部