Node.js?中?fs?模塊的高級用法實例詳解
fs
模塊不僅提供了基本的文件讀寫操作,還支持一些高級功能,如流式讀寫、文件監(jiān)視、Promise API 等。這些高級用法可以更好地滿足復雜場景的需求,如大文件處理、實時監(jiān)控等。
1. 流式讀寫
流(Stream)是 Node.js 中處理大文件或連續(xù)數(shù)據(jù)的核心概念。fs
模塊提供了 fs.createReadStream
和 fs.createWriteStream
方法,用于以流的方式讀寫文件。
1.1 流式讀取文件
const fs = require('fs'); // 創(chuàng)建可讀流 const readStream = fs.createReadStream('largeFile.txt', 'utf8'); // 監(jiān)聽數(shù)據(jù)事件 readStream.on('data', (chunk) => { console.log('Received chunk:', chunk.length); }); // 監(jiān)聽結(jié)束事件 readStream.on('end', () => { console.log('File reading completed'); }); // 監(jiān)聽錯誤事件 readStream.on('error', (err) => { console.error('Error reading file:', err); });
說明:
fs.createReadStream
創(chuàng)建一個可讀流,逐塊讀取文件內(nèi)容。data
事件:每次讀取到數(shù)據(jù)塊時觸發(fā)。end
事件:文件讀取完成時觸發(fā)。error
事件:讀取過程中發(fā)生錯誤時觸發(fā)。
1.2 流式寫入文件
const fs = require('fs'); // 創(chuàng)建可寫流 const writeStream = fs.createWriteStream('output.txt'); // 寫入數(shù)據(jù) writeStream.write('Hello, world!\n'); writeStream.write('This is a stream example.\n'); // 結(jié)束寫入 writeStream.end(); // 監(jiān)聽完成事件 writeStream.on('finish', () => { console.log('File writing completed'); }); // 監(jiān)聽錯誤事件 writeStream.on('error', (err) => { console.error('Error writing file:', err); });
說明:
fs.createWriteStream
創(chuàng)建一個可寫流,逐塊寫入文件內(nèi)容。write
方法:寫入數(shù)據(jù)。end
方法:結(jié)束寫入。finish
事件:寫入完成時觸發(fā)。error
事件:寫入過程中發(fā)生錯誤時觸發(fā)。
1.3 管道操作
管道(Pipe)是將可讀流和可寫流連接起來的便捷方式,常用于文件復制。
const fs = require('fs'); // 創(chuàng)建可讀流和可寫流 const readStream = fs.createReadStream('source.txt'); const writeStream = fs.createWriteStream('destination.txt'); // 使用管道復制文件 readStream.pipe(writeStream); // 監(jiān)聽完成事件 writeStream.on('finish', () => { console.log('File copied successfully'); }); // 監(jiān)聽錯誤事件 readStream.on('error', (err) => { console.error('Error reading file:', err); }); writeStream.on('error', (err) => { console.error('Error writing file:', err); });
2. 文件監(jiān)視
fs
模塊提供了 fs.watch
和 fs.watchFile
方法,用于監(jiān)視文件或目錄的變化。
2.1 使用 fs.watch
const fs = require('fs'); // 監(jiān)視文件變化 const watcher = fs.watch('example.txt', (eventType, filename) => { console.log(`Event type: ${eventType}`); if (filename) { console.log(`File changed: ${filename}`); } }); // 關(guān)閉監(jiān)視器 setTimeout(() => { watcher.close(); console.log('Watcher closed'); }, 10000); // 10 秒后關(guān)閉
說明:
fs.watch
監(jiān)視文件或目錄的變化。eventType
:事件類型(如change
、rename
)。filename
:發(fā)生變化的文件名。
2.2 使用 fs.watchFile
const fs = require('fs'); // 監(jiān)視文件變化 fs.watchFile('example.txt', { interval: 1000 }, (curr, prev) => { if (curr.mtime !== prev.mtime) { console.log('File modified'); } }); // 停止監(jiān)視 setTimeout(() => { fs.unwatchFile('example.txt'); console.log('Stopped watching file'); }, 10000); // 10 秒后停止
說明:
fs.watchFile
定期檢查文件狀態(tài)。curr
和prev
:當前和之前的文件狀態(tài)對象。interval
:檢查間隔(毫秒)。
3. Promise API
Node.js 從 v10 開始提供了 fs.promises
API,支持基于 Promise 的文件操作。
3.1 使用 fs.promises 讀取文件
const fs = require('fs').promises; async function readFile() { try { const data = await fs.readFile('example.txt', 'utf8'); console.log('File content:', data); } catch (err) { console.error('Failed to read file:', err); } } readFile();
3.2 使用 fs.promises 寫入文件
const fs = require('fs').promises; async function writeFile() { try { await fs.writeFile('example.txt', 'Hello, world!', 'utf8'); console.log('File written successfully'); } catch (err) { console.error('Failed to write file:', err); } } writeFile();
4. 遞歸目錄操作
4.1 遞歸讀取目錄
const fs = require('fs'); const path = require('path'); async function readDirRecursive(dir) { const files = await fs.promises.readdir(dir); for (const file of files) { const filePath = path.join(dir, file); const stats = await fs.promises.stat(filePath); if (stats.isDirectory()) { await readDirRecursive(filePath); // 遞歸讀取子目錄 } else { console.log('File:', filePath); } } } readDirRecursive('./').catch((err) => { console.error('Failed to read directory:', err); });
4.2 遞歸刪除目錄
const fs = require('fs'); const path = require('path'); async function deleteDirRecursive(dir) { const files = await fs.promises.readdir(dir); for (const file of files) { const filePath = path.join(dir, file); const stats = await fs.promises.stat(filePath); if (stats.isDirectory()) { await deleteDirRecursive(filePath); // 遞歸刪除子目錄 } else { await fs.promises.unlink(filePath); // 刪除文件 console.log('Deleted file:', filePath); } } await fs.promises.rmdir(dir); // 刪除空目錄 console.log('Deleted directory:', dir); } deleteDirRecursive('./temp').catch((err) => { console.error('Failed to delete directory:', err); });
5. 總結(jié)
- 流式讀寫:適合處理大文件,避免內(nèi)存占用過高。
- 文件監(jiān)視:實時監(jiān)控文件或目錄的變化。
- Promise API:簡化異步操作,避免回調(diào)地獄。
- 遞歸操作:處理嵌套目錄結(jié)構(gòu)。
通過掌握 fs
模塊的高級用法,可以更好地應對復雜的文件操作場景,提升代碼的性能和可維護性。
到此這篇關(guān)于Node.js 中 fs 模塊的高級用法的文章就介紹到這了,更多相關(guān)Node.js fs 模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Node.js?內(nèi)置模塊fs文件系統(tǒng)操作示例詳解
- Node.js?操作本地文件及深入了解fs內(nèi)置模塊
- 總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識)
- Node.js中fs模塊的使用方法
- node.js-fs文件系統(tǒng)模塊這是你知道嗎
- Node.js 中的 fs 模塊與Path模塊方法詳解
- Node.js中文件系統(tǒng)fs模塊的使用及常用接口
- Node.js fs模塊(文件模塊)創(chuàng)建、刪除目錄(文件)讀取寫入文件流的方法
- node.js基于fs模塊對系統(tǒng)文件及目錄進行讀寫操作的方法詳解
- 淺談Node.js:fs文件系統(tǒng)模塊
相關(guān)文章
sublime text配置node.js調(diào)試(圖文教程)
下面小編就為大家分享一篇sublime text配置node.js調(diào)試(圖文教程),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11nodejs報digital?envelope?routines::unsupported錯誤的最新解決方法
這篇文章主要介紹了nodejs報digital?envelope?routines::unsupported錯誤的最新解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02關(guān)于node-bindings無法在Electron中使用的解決辦法
今天小編就為大家分享一篇關(guān)于關(guān)于node-bindings無法在Electron中使用的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Windows8下搭建Node.js開發(fā)環(huán)境教程
這篇文章主要介紹了Windows8下搭建Node.js開發(fā)環(huán)境教程,Win8下安裝node.js也比較簡單,只是一些權(quán)限比較麻煩,需要的朋友可以參考下2014-09-09