1. 程式人生 > 其它 >說說對 Node 中的 fs 模組的理解? 有哪些常用方法?

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

一、是什麼

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

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

匯入模組如下:

constfs=require('fs');

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

二、檔案知識

在計算機中有關於檔案的知識:

  • 許可權位 mode
  • 標識位 flag
  • 檔案描述為 fd

許可權位 mode

針對檔案所有者、檔案所屬組、其他使用者進行許可權分配,其中型別又分成讀、寫和執行,具備許可權位4、2、1,不具備許可權為0

如在linux

檢視檔案許可權位:

drwxr-xr-x1PandaShen1971210Jun2814:41core
-rw-r--r--1PandaShen197121293Jun2317:44index.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

結果為返回檔案的內容

constfs=require("fs");

letbuf=fs.readFileSync("1.txt");
letdata=fs.readFileSync("1.txt","utf8");

console.log(buf);//<Buffer48656c6c6f>
console.log(data);//Hello

fs.readFile

非同步讀取方法readFilereadFileSync的前兩個引數相同,最後一個引數為回撥函式,函式內有兩個引數err(錯誤)和data(資料),該方法沒有返回值,回撥函式在讀取檔案成功後執行

constfs=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

constfs=require("fs");

fs.writeFileSync("2.txt","Helloworld");
letdata=fs.readFileSync("2.txt","utf8");

console.log(data);//Helloworld

writeFile

非同步寫入,writeFilewriteFileSync的前三個引數相同,最後一個引數為回撥函式,函式內有一個引數err(錯誤),回撥函式在檔案寫入資料成功後執行

constfs=require("fs");

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

檔案追加寫入

appendFileSync

引數如下:

  • 第一個引數為寫入檔案的路徑或檔案描述符
  • 第二個引數為寫入的資料,型別為 String 或 Buffer
  • 第三個引數為 options,預設值為 null,其中有 encoding(編碼,預設為 utf8)、 flag(標識位,預設為 a)和 mode(許可權位,預設為 0o666),也可直接傳入 encoding
constfs=require("fs");

fs.appendFileSync("3.txt","world");
letdata=fs.readFileSync("3.txt","utf8");

appendFile

非同步追加寫入方法appendFileappendFileSync的前三個引數相同,最後一個引數為回撥函式,函式內有一個引數err(錯誤),回撥函式在檔案追加寫入資料成功後執行

constfs=require("fs");

fs.appendFile("3.txt","world",err=>{
if(!err){
fs.readFile("3.txt","utf8",(err,data)=>{
console.log(data);//Helloworld
});
}
});

檔案拷貝

copyFileSync

同步拷貝

constfs=require("fs");

fs.copyFileSync("3.txt","4.txt");
letdata=fs.readFileSync("4.txt","utf8");

console.log(data);//Helloworld

copyFile

非同步拷貝

constfs=require("fs");

fs.copyFile("3.txt","4.txt",()=>{
fs.readFile("4.txt","utf8",(err,data)=>{
console.log(data);//Helloworld
});
});

建立目錄

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