Node.js?中?fs?模塊的高級(jí)用法實(shí)例詳解
fs
模塊不僅提供了基本的文件讀寫(xiě)操作,還支持一些高級(jí)功能,如流式讀寫(xiě)、文件監(jiān)視、Promise API 等。這些高級(jí)用法可以更好地滿足復(fù)雜場(chǎng)景的需求,如大文件處理、實(shí)時(shí)監(jiān)控等。
1. 流式讀寫(xiě)
流(Stream)是 Node.js 中處理大文件或連續(xù)數(shù)據(jù)的核心概念。fs
模塊提供了 fs.createReadStream
和 fs.createWriteStream
方法,用于以流的方式讀寫(xiě)文件。
1.1 流式讀取文件
const fs = require('fs'); // 創(chuàng)建可讀流 const readStream = fs.createReadStream('largeFile.txt', 'utf8'); // 監(jiān)聽(tīng)數(shù)據(jù)事件 readStream.on('data', (chunk) => { console.log('Received chunk:', chunk.length); }); // 監(jiān)聽(tīng)結(jié)束事件 readStream.on('end', () => { console.log('File reading completed'); }); // 監(jiān)聽(tīng)錯(cuò)誤事件 readStream.on('error', (err) => { console.error('Error reading file:', err); });
說(shuō)明:
fs.createReadStream
創(chuàng)建一個(gè)可讀流,逐塊讀取文件內(nèi)容。data
事件:每次讀取到數(shù)據(jù)塊時(shí)觸發(fā)。end
事件:文件讀取完成時(shí)觸發(fā)。error
事件:讀取過(guò)程中發(fā)生錯(cuò)誤時(shí)觸發(fā)。
1.2 流式寫(xiě)入文件
const fs = require('fs'); // 創(chuàng)建可寫(xiě)流 const writeStream = fs.createWriteStream('output.txt'); // 寫(xiě)入數(shù)據(jù) writeStream.write('Hello, world!\n'); writeStream.write('This is a stream example.\n'); // 結(jié)束寫(xiě)入 writeStream.end(); // 監(jiān)聽(tīng)完成事件 writeStream.on('finish', () => { console.log('File writing completed'); }); // 監(jiān)聽(tīng)錯(cuò)誤事件 writeStream.on('error', (err) => { console.error('Error writing file:', err); });
說(shuō)明:
fs.createWriteStream
創(chuàng)建一個(gè)可寫(xiě)流,逐塊寫(xiě)入文件內(nèi)容。write
方法:寫(xiě)入數(shù)據(jù)。end
方法:結(jié)束寫(xiě)入。finish
事件:寫(xiě)入完成時(shí)觸發(fā)。error
事件:寫(xiě)入過(guò)程中發(fā)生錯(cuò)誤時(shí)觸發(fā)。
1.3 管道操作
管道(Pipe)是將可讀流和可寫(xiě)流連接起來(lái)的便捷方式,常用于文件復(fù)制。
const fs = require('fs'); // 創(chuàng)建可讀流和可寫(xiě)流 const readStream = fs.createReadStream('source.txt'); const writeStream = fs.createWriteStream('destination.txt'); // 使用管道復(fù)制文件 readStream.pipe(writeStream); // 監(jiān)聽(tīng)完成事件 writeStream.on('finish', () => { console.log('File copied successfully'); }); // 監(jiān)聽(tīng)錯(cuò)誤事件 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)閉
說(shuō)明:
fs.watch
監(jiān)視文件或目錄的變化。eventType
:事件類(lèi)型(如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 秒后停止
說(shuō)明:
fs.watchFile
定期檢查文件狀態(tài)。curr
和prev
:當(dāng)前和之前的文件狀態(tài)對(duì)象。interval
:檢查間隔(毫秒)。
3. Promise API
Node.js 從 v10 開(kāi)始提供了 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 寫(xiě)入文件
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é)
- 流式讀寫(xiě):適合處理大文件,避免內(nèi)存占用過(guò)高。
- 文件監(jiān)視:實(shí)時(shí)監(jiān)控文件或目錄的變化。
- Promise API:簡(jiǎn)化異步操作,避免回調(diào)地獄。
- 遞歸操作:處理嵌套目錄結(jié)構(gòu)。
通過(guò)掌握 fs
模塊的高級(jí)用法,可以更好地應(yīng)對(duì)復(fù)雜的文件操作場(chǎng)景,提升代碼的性能和可維護(hù)性。
到此這篇關(guān)于Node.js 中 fs 模塊的高級(jí)用法的文章就介紹到這了,更多相關(guān)Node.js fs 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Node.js?內(nèi)置模塊fs文件系統(tǒng)操作示例詳解
- Node.js?操作本地文件及深入了解fs內(nèi)置模塊
- 總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識(shí))
- Node.js中fs模塊的使用方法
- node.js-fs文件系統(tǒng)模塊這是你知道嗎
- Node.js 中的 fs 模塊與Path模塊方法詳解
- Node.js中文件系統(tǒng)fs模塊的使用及常用接口
- Node.js fs模塊(文件模塊)創(chuàng)建、刪除目錄(文件)讀取寫(xiě)入文件流的方法
- node.js基于fs模塊對(duì)系統(tǒng)文件及目錄進(jìn)行讀寫(xiě)操作的方法詳解
- 淺談Node.js:fs文件系統(tǒng)模塊
相關(guān)文章
sublime text配置node.js調(diào)試(圖文教程)
下面小編就為大家分享一篇sublime text配置node.js調(diào)試(圖文教程),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11nodejs入門(mén)教程六:express模塊用法示例
這篇文章主要介紹了nodejs入門(mén)教程之express模塊用法,結(jié)合實(shí)例形式分析了express模塊的功能、創(chuàng)建、路由相關(guān)使用技巧,需要的朋友可以參考下2017-04-04npm?install安裝過(guò)程報(bào)錯(cuò)的實(shí)用解決辦法
最近做項(xiàng)目遇到npm install 的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于npm?install安裝過(guò)程報(bào)錯(cuò)的實(shí)用解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06nodejs報(bào)digital?envelope?routines::unsupported錯(cuò)誤的最新解決方法
這篇文章主要介紹了nodejs報(bào)digital?envelope?routines::unsupported錯(cuò)誤的最新解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02關(guān)于node-bindings無(wú)法在Electron中使用的解決辦法
今天小編就為大家分享一篇關(guān)于關(guān)于node-bindings無(wú)法在Electron中使用的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Mac下安裝node.js及環(huán)境配置全過(guò)程
這篇文章主要介紹了Mac下安裝node.js及環(huán)境配置全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Windows8下搭建Node.js開(kāi)發(fā)環(huán)境教程
這篇文章主要介紹了Windows8下搭建Node.js開(kāi)發(fā)環(huán)境教程,Win8下安裝node.js也比較簡(jiǎn)單,只是一些權(quán)限比較麻煩,需要的朋友可以參考下2014-09-09node強(qiáng)緩存和協(xié)商緩存實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了node強(qiáng)緩存和協(xié)商緩存實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07