面試官:說說對 Node 中的 Fs 模塊的理解? 有哪些常用方法?
本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯(lián)系JS每日一題公眾號。
一、是什么
fs(file system),該模塊提供本地文件的讀寫能力,基本上是POSIX文件操作命令的簡單包裝
可以說,所有與文件的操作都是通過fs核心模塊實現(xiàn)
導入模塊如下:
- const fs = require('fs');
 
這個模塊對所有文件系統(tǒng)操作提供異步(不具有sync 后綴)和同步(具有 sync 后綴)兩種操作方式,而供開發(fā)者選擇
二、文件知識
在計算機中有關于文件的知識:
- 權限位 mode
 - 標識位 flag
 - 文件描述為 fd
 
權限位 mode
針對文件所有者、文件所屬組、其他用戶進行權限分配,其中類型又分成讀、寫和執(zhí)行,具備權限位4、2、1,不具備權限為0
如在linux查看文件權限位:
- drwxr-xr-x 1 PandaShen 197121 0 Jun 28 14:41 core
 - -rw-r--r-- 1 PandaShen 197121 293 Jun 23 17:44 index.md
 
在開頭前十位中,d為文件夾,-為文件,后九位就代表當前用戶、用戶所屬組和其他用戶的權限位,按每三位劃分,分別代表讀(r)、寫(w)和執(zhí)行(x),- 代表沒有當前位對應的權限
標識位
標識位代表著對文件的操作方式,如可讀、可寫、即可讀又可寫等等,如下表所示:
| 符號 | 含義 | 
|---|---|
| r | 讀取文件,如果文件不存在則拋出異常。 | 
| r+ | 讀取并寫入文件,如果文件不存在則拋出異常。 | 
| rs | 讀取并寫入文件,指示操作系統(tǒng)繞開本地文件系統(tǒng)緩存。 | 
| w | 寫入文件,文件不存在會被創(chuàng)建,存在則清空后寫入。 | 
| wx | 寫入文件,排它方式打開。 | 
| w+ | 讀取并寫入文件,文件不存在則創(chuàng)建文件,存在則清空后寫入。 | 
| wx+ | 和 w+ 類似,排他方式打開。 | 
| a | 追加寫入,文件不存在則創(chuàng)建文件。 | 
| ax | 與 a 類似,排他方式打開。 | 
| a+ | 讀取并追加寫入,不存在則創(chuàng)建。 | 
| ax+ | 與 a+ 類似,排他方式打開。 | 
文件描述為 fd
操作系統(tǒng)會為每個打開的文件分配一個名為文件描述符的數(shù)值標識,文件操作使用這些文件描述符來識別與追蹤每個特定的文件
Window系統(tǒng)使用了一個不同但概念類似的機制來追蹤資源,為方便用戶,NodeJS抽象了不同操作系統(tǒng)間的差異,為所有打開的文件分配了數(shù)值的文件描述符
在 NodeJS中,每操作一個文件,文件描述符是遞增的,文件描述符一般從 3 開始,因為前面有 0、1、2三個比較特殊的描述符,分別代表 process.stdin(標準輸入)、process.stdout(標準輸出)和 process.stderr(錯誤輸出)
三、方法
下面針對fs模塊常用的方法進行展開:
- 文件讀取
 - 文件寫入
 - 文件追加寫入
 - 文件拷貝
 - 創(chuàng)建目錄
 - 文件讀取
 
fs.readFileSync
同步讀取,參數(shù)如下:
- 第一個參數(shù)為讀取文件的路徑或文件描述符
 - 第二個參數(shù)為 options,默認值為 null,其中有 encoding(編碼,默認為 null)和 flag(標識位,默認為 r),也可直接傳入 encoding
 
結果為返回文件的內(nèi)容
- const fs = require("fs");
 - let buf = fs.readFileSync("1.txt");
 - let data = fs.readFileSync("1.txt", "utf8");
 - console.log(buf); // <Buffer 48 65 6c 6c 6f>
 - console.log(data); // Hello
 
fs.readFile
異步讀取方法 readFile 與 readFileSync 的前兩個參數(shù)相同,最后一個參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有兩個參數(shù) err(錯誤)和 data(數(shù)據(jù)),該方法沒有返回值,回調(diào)函數(shù)在讀取文件成功后執(zhí)行
- const fs = require("fs");
 - fs.readFile("1.txt", "utf8", (err, data) => {
 - if(!err){
 - console.log(data); // Hello
 - }
 - });
 
文件寫入
writeFileSync
同步寫入,有三個參數(shù):
- 第一個參數(shù)為寫入文件的路徑或文件描述符
 - 第二個參數(shù)為寫入的數(shù)據(jù),類型為 String 或 Buffer
 - 第三個參數(shù)為 options,默認值為 null,其中有 encoding(編碼,默認為 utf8)、 flag(標識位,默認為 w)和 mode(權限位,默認為 0o666),也可直接傳入 encoding
 
- const fs = require("fs");
 - fs.writeFileSync("2.txt", "Hello world");
 - let data = fs.readFileSync("2.txt", "utf8");
 - console.log(data); // Hello world
 
writeFile
異步寫入,writeFile 與 writeFileSync 的前三個參數(shù)相同,最后一個參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有一個參數(shù) err(錯誤),回調(diào)函數(shù)在文件寫入數(shù)據(jù)成功后執(zhí)行
- const fs = require("fs");
 - fs.writeFile("2.txt", "Hello world", err => {
 - if (!err) {
 - fs.readFile("2.txt", "utf8", (err, data) => {
 - console.log(data); // Hello world
 - });
 - }
 - });
 
文件追加寫入
appendFileSync
參數(shù)如下:
- 第一個參數(shù)為寫入文件的路徑或文件描述符
 - 第二個參數(shù)為寫入的數(shù)據(jù),類型為 String 或 Buffer
 - 第三個參數(shù)為 options,默認值為 null,其中有 encoding(編碼,默認為 utf8)、 flag(標識位,默認為 a)和 mode(權限位,默認為 0o666),也可直接傳入 encoding
 
- const fs = require("fs");
 - fs.appendFileSync("3.txt", " world");
 - let data = fs.readFileSync("3.txt", "utf8");
 
appendFile
異步追加寫入方法 appendFile 與 appendFileSync 的前三個參數(shù)相同,最后一個參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有一個參數(shù) err(錯誤),回調(diào)函數(shù)在文件追加寫入數(shù)據(jù)成功后執(zhí)行
- const fs = require("fs");
 - fs.appendFile("3.txt", " world", err => {
 - if (!err) {
 - fs.readFile("3.txt", "utf8", (err, data) => {
 - console.log(data); // Hello world
 - });
 - }
 - });
 
文件拷貝
copyFileSync
同步拷貝
- const fs = require("fs");
 - fs.copyFileSync("3.txt", "4.txt");
 - let data = fs.readFileSync("4.txt", "utf8");
 - console.log(data); // Hello world
 
copyFile
異步拷貝
- const fs = require("fs");
 - fs.copyFile("3.txt", "4.txt", () => {
 - fs.readFile("4.txt", "utf8", (err, data) => {
 - console.log(data); // Hello world
 - });
 - });
 
創(chuàng)建目錄
mkdirSync
同步創(chuàng)建,參數(shù)為一個目錄的路徑,沒有返回值,在創(chuàng)建目錄的過程中,必須保證傳入的路徑前面的文件目錄都存在,否則會拋出異常
- // 假設已經(jīng)有了 a 文件夾和 a 下的 b 文件夾
 - fs.mkdirSync("a/b/c")
 
mkdir
異步創(chuàng)建,第二個參數(shù)為回調(diào)函數(shù)
- fs.mkdir("a/b/c", err => {
 - if (!err) console.log("創(chuàng)建成功");
 - });
 
參考文獻
http://nodejs.cn/api/fs.html
https://segmentfault.com/a/1190000019913303

















 
 
 

 
 
 
 