1.3 fs模塊詳解

?fs 模塊詳解

Node.js 的?fs?模塊提供了與文件系統交互的能力,是服務器端編程的核心模塊之一。它支持同步、異步(回調式)和 Promise 三種 API 風格,可滿足不同場景的需求。

1. 模塊引入
const fs = require('fs');          // 回調式 API
const fsPromises = require('fs').promises; // Promise API
const fsSync = require('fs');      // 同步 API
2. 文件讀取操作
異步回調方式
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error('讀取文件失敗:', err);return;}console.log('文件內容:', data);
});
Promise 方式
fsPromises.readFile('example.txt', 'utf8').then(data => console.log('文件內容:', data)).catch(err => console.error('讀取文件失敗:', err));// 或使用 async/await
async function readFileAsync() {try {const data = await fsPromises.readFile('example.txt', 'utf8');console.log('文件內容:', data);} catch (err) {console.error('讀取文件失敗:', err);}
}
同步方式
try {const data = fsSync.readFileSync('example.txt', 'utf8');console.log('文件內容:', data);
} catch (err) {console.error('讀取文件失敗:', err);
}
3. 文件寫入操作
覆蓋寫入
// 異步
fs.writeFile('output.txt', 'Hello World!', err => {if (err) console.error('寫入失敗:', err);
});// Promise
fsPromises.writeFile('output.txt', 'Hello World!').then(() => console.log('寫入成功')).catch(err => console.error('寫入失敗:', err));// 同步
fsSync.writeFileSync('output.txt', 'Hello World!');
追加寫入
fs.appendFile('log.txt', '追加內容\n', err => { /* ... */ });
fsPromises.appendFile('log.txt', '追加內容\n');
fsSync.appendFileSync('log.txt', '追加內容\n');
4. 文件和目錄操作
創建目錄
// 遞歸創建多級目錄(如 mkdir -p)
fs.mkdir('dir/subdir', { recursive: true }, err => { /* ... */ });
fsPromises.mkdir('dir/subdir', { recursive: true });
fsSync.mkdirSync('dir/subdir', { recursive: true });
讀取目錄
fs.readdir('dir', (err, files) => {console.log('目錄內容:', files); // 返回文件名數組
});
重命名 / 移動文件
fs.rename('old.txt', 'new.txt', err => { /* ... */ });
fsPromises.rename('old.txt', 'new.txt');
fsSync.renameSync('old.txt', 'new.txt');
刪除文件 / 目錄
// 刪除文件
fs.unlink('file.txt', err => { /* ... */ });
fsPromises.unlink('file.txt');
fsSync.unlinkSync('file.txt');// 刪除目錄(遞歸刪除使用 { recursive: true })
fs.rmdir('dir', err => { /* ... */ });
fsPromises.rmdir('dir', { recursive: true });
fsSync.rmdirSync('dir', { recursive: true });
5. 文件狀態檢查
fs.stat('example.txt', (err, stats) => {if (err) return;console.log('是否為文件:', stats.isFile());console.log('是否為目錄:', stats.isDirectory());console.log('文件大小:', stats.size, '字節');console.log('創建時間:', stats.ctime);
});// Promise 版本
fsPromises.stat('example.txt').then(stats => { /* ... */ });
6. 流式操作

適合處理大文件,避免內存溢出:

讀取流
const readStream = fs.createReadStream('large_file.txt', {encoding: 'utf8',highWaterMark: 1024 * 1024 // 1MB 緩沖區
});readStream.on('data', chunk => {console.log('讀取塊:', chunk.length);
});readStream.on('end', () => console.log('讀取完成'));
readStream.on('error', err => console.error('讀取錯誤:', err));
寫入流
const writeStream = fs.createWriteStream('output.txt');writeStream.write('第一部分內容');
writeStream.write('第二部分內容');
writeStream.end(); // 結束寫入writeStream.on('finish', () => console.log('寫入完成'));
管道操作(高效復制文件)
const readStream = fs.createReadStream('input.txt');
const writeStream = fs.createWriteStream('output.txt');readStream.pipe(writeStream); // 自動處理背壓問題
7. 文件路徑處理

通常配合?path?模塊使用:

const path = require('path');const filePath = '/home/user/dir/file.txt';
console.log('文件名:', path.basename(filePath)); // 'file.txt'
console.log('目錄:', path.dirname(filePath));    // '/home/user/dir'
console.log('擴展名:', path.extname(filePath));  // '.txt'
console.log('絕對路徑:', path.resolve('file.txt')); // 解析為絕對路徑
8. 監聽文件變化
// 監聽文件或目錄變化
fs.watch('dir', (eventType, filename) => {console.log(`文件 ${filename} 發生 ${eventType} 事件`);
});
9. 同步 vs 異步 vs Promise
類型適用場景特點
同步 API配置加載、腳本工具阻塞執行,可能導致性能問題
回調 API傳統異步場景需處理回調地獄問題
Promise API現代異步代碼(async/await)避免回調地獄,支持鏈式調用
10. 最佳實踐
  1. 優先使用異步 API:Node.js 是單線程的,同步操作會阻塞整個事件循環。
  2. 錯誤處理:始終處理文件操作可能拋出的錯誤。
  3. 大文件處理:使用流 API 處理大文件,避免內存溢出。
  4. 路徑安全:使用?path?模塊處理路徑,避免路徑遍歷攻擊。
  5. Promise 化:若需使用回調 API,可用?util.promisify?轉換為 Promise:
    const { promisify } = require('util');
    const readFile = promisify(fs.readFile);
    
11. 注意事項
  • 文件權限:確保 Node.js 進程有足夠權限訪問文件。
  • 跨平臺兼容性:Windows 和 Unix 系統的路徑分隔符不同,使用?path?模塊處理。
  • 性能考量:頻繁的文件操作可能成為性能瓶頸,考慮緩存策略。

總結

fs?模塊是 Node.js 核心能力之一,提供了豐富的文件系統操作接口。根據場景選擇合適的 API 風格(同步、回調或 Promise),并遵循最佳實踐以確保代碼健壯性和性能。對于復雜操作,推薦使用 Promise API 和?async/await?語法提高代碼可讀性。

const fs = require('fs').promises;async function example() {try {const data = await fs.readFile('<file-path>', 'utf8');console.log(data);await fs.writeFile('<new-file-path>', '一些內容');console.log('文件已保存');} catch (err) {console.error(err);}
}example();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83675.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 70 爬樓梯(Java)

爬樓梯問題&#xff1a;動態規劃與斐波那契的巧妙結合 問題描述 假設你正在爬樓梯&#xff0c;需要爬 n 階才能到達樓頂。每次你可以爬 1 或 2 個臺階。求有多少種不同的方法可以爬到樓頂&#xff1f; 示例&#xff1a; n 2 → 輸出 2&#xff08;1階1階 或 2階&#xff0…

【學習分享】shell基礎-參數傳遞

參數傳遞 我們可以在執行 Shell 腳本時&#xff0c;向腳本傳遞參數&#xff0c;腳本內獲取參數的格式為 $n&#xff0c;n 代表一個數字&#xff0c;1 為執行腳本的第一個參數&#xff0c;2 為執行腳本的第二個參數。 例如可以使用 $1、$2 等來引用傳遞給腳本的參數&#xff0…

Fluence推出“Pointless計劃”:五種方式參與RWA算力資產新時代

2025年6月1日&#xff0c;去中心化算力平臺 Fluence 正式宣布啟動“Pointless 計劃”——這是其《Fluence Vision 2026》戰略中四項核心舉措之一&#xff0c;旨在通過貢獻驅動的積分體系&#xff0c;激勵更廣泛的社區參與&#xff0c;為用戶帶來現實世界資產&#xff08;RWA&am…

Excel數據分析:基礎

在現代辦公環境中&#xff0c;Excel 是一款不可或缺的工具&#xff0c;它是 Microsoft&#xff08;微軟&#xff09;開發的電子表格軟件&#xff0c;用于處理和分析結構化數據。市場上還有其他類似的軟件&#xff0c;如 Google Sheets 和 Apple Numbers&#xff0c;但 Excel 以…

12V降5V12A大功率WD5030A,充電器、便攜式設備、網絡及工業領域的理想選擇

WD5030A 高效單片同步降壓型直流 / 直流轉換器 一、芯片核心概述 WD5030A 是一款高性能同步降壓型 DC/DC 轉換器&#xff0c;采用 平均電流模式控制架構&#xff08;帶頻率抖動功能&#xff09;&#xff0c;具備以下核心優勢&#xff1a; 精準電流控制&#xff1a;快速響應負…

企業級AI邁入黃金時代,企業該如何向AI“蝶變”?

科技云報到原創。 近日&#xff0c;微軟&#xff08;MSFT.US&#xff09;在最新全員大會上高調展示企業級AI業務進展&#xff0c;其中與巴克萊銀行達成的10萬份Copilot許可證交易成為焦點。 微軟首席商務官賈德森阿爾索夫在會上披露&#xff0c;這家英國金融巨頭已簽約采購相…

Java編程課(一)

Java編程課 一、java簡介二、Java基礎語法2.1 環境搭建2.2 使用Intellij IDEA新建java項目2.3 Java運行介紹2.4 參數說明2.5 Java基礎語法2.6 注釋2.7 變量和常量一、java簡介 Java是一種廣泛使用的高級編程語言,最初由Sun Microsystems于1995年發布。它被設計為具有簡單、可…

【Java Web】速通Tomcat

參考筆記:JavaWeb 速通Tomcat_tomcat部署java項目-CSDN博客 目錄 一、Tomcat服務 1. 下載和安裝 2. 啟動Tomcat服務 3. 啟動Tomcat服務的注意事項 4. 關閉Tomcat服務 二、Tomcat的目錄結構 1. bin ?? 2. conf ?? 3. lib 4. logs 5. temp 6. webapps 7. work 三、Web項目…

Mysql 身份認證繞過漏洞 CVE-2012-2122

前言&#xff1a;CVE-2012-2122 是一個影響 MySQL 和 MariaDB 的身份驗證漏洞&#xff0c;存在于特定版本中 vulhub/mysql/CVE-2012-2122/README.zh-cn.md at master vulhub/vulhubhttps://github.com/vulhub/vulhub/blob/master/mysql/CVE-2012-2122/README.zh-cn.md 任務一…

Win10停更,Win11不好用?現在Mac電腦比Win11電腦更便宜

最近不少朋友在換電腦前都犯了難。 以前大家最常說的一句是&#xff1a;“Mac太貴了&#xff0c;還是買Windows吧。”但現在不一樣了&#xff0c;國補教育優惠下來&#xff0c;新款M4芯片的Mac mini的入門價已經降到了3000元左右&#xff0c;曾經的價格壁壘&#xff0c;已經不…

C#中Struct與IntPtr轉換:實用擴展方法

C#中Struct與IntPtr轉換&#xff1a;實用擴展方法 在 C# 編程的世界里&#xff0c;我們常常會遇到需要與非托管代碼交互&#xff0c;或者進行一些底層內存操作的場景。這時&#xff0c;IntPtr類型就顯得尤為重要&#xff0c;它可以表示一個指針或句柄&#xff0c;用來指向非托…

手機歸屬地查詢接口如何用Java調用?

一、什么是手機歸屬地查詢接口&#xff1f; 是一種便捷、高效的工具&#xff0c;操作簡單&#xff0c;請求速度快。它不僅能夠提高用戶填寫地址的效率&#xff0c;還能幫助企業更好地了解客戶需求&#xff0c;制定個性化的營銷策略&#xff0c;降低風險。隨著移動互聯網的發展…

43、視圖解析-Thymeleaf初體驗

43、視圖解析-Thymeleaf初體驗 “43、視圖解析-Thymeleaf初體驗”通常是指在學習Spring Boot框架時&#xff0c;關于如何使用Thymeleaf模板引擎進行視圖解析的入門課程或章節。以下是對該主題的詳細介紹&#xff1a; #### Thymeleaf簡介 - **定義**&#xff1a;Thymeleaf是一個…

Day 40訓練

Day 40 訓練 PyTorch 圖像數據訓練與測試的規范寫法單通道圖像的規范訓練流程數據預處理與加載模型定義訓練與測試函數封裝模型訓練執行 彩色圖像的擴展應用數據預處理調整模型結構調整 關鍵要點總結 知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封…

杰理可視化SDK--系統死機異常調試

杰理可視化SDK--系統死機異常調試 系統異常原因杰理SDK異常調試準備工作杰理SDK系統異常定位異常代碼示例1異常代碼示例2 在使用杰理可視化SDK進行軟件開發時&#xff0c;往往會遇到一些系統異常問題&#xff0c;系統異常是指芯片在運行代碼時&#xff0c;由于軟件或硬件狀態出…

圖簡記。。

模仿&#xff1a; algorithm-journey/src/class059/Code01_CreateGraph.java at main algorithmzuo/algorithm-journey Code01_CreateGraph C語言&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAXN 11 #define MAX…

Linux 常用命令與 Shell 簡介

文章目錄 **Linux 常用命令與 Shell 簡介****Shell 簡介****什么是 Shell&#xff1f;****Shell 的工作原理****常見 Shell 類型****命令行基礎****Tab 補全與通配符** **Linux 常用命令****1. 入門必備命令****1.1 尋求幫助 - man 命令****1.2 用戶間切換 - su 命令****1.3 特…

基于51單片機的超聲波智能避障小車仿真

目錄 具體實現功能 設計介紹 資料內容 全部內容 資料獲取 具體實現功能 &#xff08;1&#xff09;超聲波實時測量小車與障礙物間的距離&#xff0c;并用LCD1602顯示。 &#xff08;2&#xff09;當測得的距離超過50時&#xff0c;前進電機轉動&#xff08;模擬后輪&#…

AIGC工具平臺-GPT-SoVITS-v4-TTS音頻推理克隆

聲音克隆與語音合成的結合&#xff0c;是近年來生成式AI在多模態方向上的重要落地場景之一。隨著預訓練模型能力的增強&#xff0c;結合語音識別、音素映射與TTS合成的端到端系統成為初學者可以上手實踐的全流程方案。 圍繞 GPT-SoVITS-v4-TTS 模塊&#xff0c;介紹了其在整合…

Android7 Input(十)View 處理Input事件pipeline

概述: 本文主要描述View對InputEvent事件pipeline處理過程。 本文涉及的源碼路徑 frameworks/base/core/java/android/view/ViewRootImpl.java InputEvent事件處理 View處理input事件是調用doProcessInputEvents方法&#xff0c;如下所示: void doProcessInputEvents() {//…