說說對 Node 中的 fs 模組的理解? 有哪些常用方法?

 

 

一、是什麼

fs(file system),該模組提供本地文件的讀寫能力,基本上是POSIX文件操作命令的簡單包裝

可以說,所有與文件的操作都是通過fs核心模組實現

導入模組如下:

const fs = require('fs');

這個模組對所有文件系統操作提供非同步(不具有sync 後綴)和同步(具有 sync 後綴)兩種操作方式,而供開發者選擇

二、文件知識

在電腦中有關於文件的知識:

  • 許可權位 mode
  • 標識位 flag
  • 文件描述為 fd

許可權位 mode

圖片

針對文件所有者、文件所屬組、其他用戶進行許可權分配,其中類型又分成讀、寫和執行,具備許可權位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)和執行(x),- 代表沒有當前位對應的許可權

標識位

標識位代表著對文件的操作方式,如可讀、可寫、即可讀又可寫等等,如下表所示:

符號 含義
r 讀取文件,如果文件不存在則拋出異常。
r+ 讀取並寫入文件,如果文件不存在則拋出異常。
rs 讀取並寫入文件,指示作業系統繞開本地文件系統快取。
w 寫入文件,文件不存在會被創建,存在則清空後寫入。
wx 寫入文件,排它方式打開。
w+ 讀取並寫入文件,文件不存在則創建文件,存在則清空後寫入。
wx+ 和 w+ 類似,排他方式打開。
a 追加寫入,文件不存在則創建文件。
ax 與 a 類似,排他方式打開。
a+ 讀取並追加寫入,不存在則創建。
ax+ 與 a+ 類似,排他方式打開。

文件描述為 fd

作業系統會為每個打開的文件分配一個名為文件描述符的數值標識,文件操作使用這些文件描述符來識別與追蹤每個特定的文件

Window系統使用了一個不同但概念類似的機制來追蹤資源,為方便用戶,NodeJS抽象了不同作業系統間的差異,為所有打開的文件分配了數值的文件描述符

在 NodeJS中,每操作一個文件,文件描述符是遞增的,文件描述符一般從 3 開始,因為前面有 012三個比較特殊的描述符,分別代表 process.stdin(標準輸入)、process.stdout(標準輸出)和 process.stderr(錯誤輸出)

三、方法

下面針對fs模組常用的方法進行展開:

  • 文件讀取
  • 文件寫入
  • 文件追加寫入
  • 文件拷貝
  • 創建目錄

文件讀取

fs.readFileSync

同步讀取,參數如下:

  • 第一個參數為讀取文件的路徑或文件描述符
  • 第二個參數為 options,默認值為 null,其中有 encoding(編碼,默認為 null)和 flag(標識位,默認為 r),也可直接傳入 encoding

結果為返迴文件的內容

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 的前兩個參數相同,最後一個參數為回調函數,函數內有兩個參數 err(錯誤)和 data(數據),該方法沒有返回值,回調函數在讀取文件成功後執行

const fs = require("fs");

fs.readFile("1.txt", "utf8", (err, data) => {
   if(!err){
       console.log(data); // Hello
   }
});

文件寫入

writeFileSync

同步寫入,有三個參數:

  • 第一個參數為寫入文件的路徑或文件描述符

  • 第二個參數為寫入的數據,類型為 String 或 Buffer

  • 第三個參數為 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 的前三個參數相同,最後一個參數為回調函數,函數內有一個參數 err(錯誤),回調函數在文件寫入數據成功後執行

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

參數如下:

  • 第一個參數為寫入文件的路徑或文件描述符
  • 第二個參數為寫入的數據,類型為 String 或 Buffer
  • 第三個參數為 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 的前三個參數相同,最後一個參數為回調函數,函數內有一個參數 err(錯誤),回調函數在文件追加寫入數據成功後執行

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
    });
});

創建目錄

mkdirSync

同步創建,參數為一個目錄的路徑,沒有返回值,在創建目錄的過程中,必須保證傳入的路徑前面的文件目錄都存在,否則會拋出異常

// 假設已經有了 a 文件夾和 a 下的 b 文件夾
fs.mkdirSync("a/b/c")

mkdir

非同步創建,第二個參數為回調函數

fs.mkdir("a/b/c", err => {
    if (!err) console.log("創建成功");
});

參考文獻

  • //nodejs.cn/api/fs.html
Tags: