Node.js?中?fs?模塊的高級用法實例詳解
fs 模塊不僅提供了基本的文件讀寫操作,還支持一些高級功能,如流式讀寫、文件監(jiān)視、Promise API 等。這些高級用法可以更好地滿足復(fù)雜場景的需求,如大文件處理、實時監(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)是將可讀流和可寫流連接起來的便捷方式,常用于文件復(fù)制。
const fs = require('fs');
// 創(chuàng)建可讀流和可寫流
const readStream = fs.createReadStream('source.txt');
const writeStream = fs.createWriteStream('destination.txt');
// 使用管道復(fù)制文件
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:當(dāng)前和之前的文件狀態(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 模塊的高級用法,可以更好地應(yīng)對復(fù)雜的文件操作場景,提升代碼的性能和可維護性。
到此這篇關(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-11
nodejs報digital?envelope?routines::unsupported錯誤的最新解決方法
這篇文章主要介紹了nodejs報digital?envelope?routines::unsupported錯誤的最新解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
關(guān)于node-bindings無法在Electron中使用的解決辦法
今天小編就為大家分享一篇關(guān)于關(guān)于node-bindings無法在Electron中使用的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Windows8下搭建Node.js開發(fā)環(huán)境教程
這篇文章主要介紹了Windows8下搭建Node.js開發(fā)環(huán)境教程,Win8下安裝node.js也比較簡單,只是一些權(quán)限比較麻煩,需要的朋友可以參考下2014-09-09

