一、是什麼
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
開始,因為前面有 0
、1
、2
三個比較特殊的描述符,分別代表 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("建立成功");
});
參考文獻
- http://nodejs.cn/api/fs.html