node里的filesystem模塊文件讀寫操作詳解
一、是什么
fs(filesystem),該模塊提供本地文件的讀寫能力,基本上是POSIX
文件操作命令的簡(jiǎn)單包裝
可以說,所有與文件的操作都是通過fs
核心模塊實(shí)現(xiàn)
導(dǎo)入模塊如下:
const fs = require('fs');
這個(gè)模塊對(duì)所有文件系統(tǒng)操作提供異步(不具有sync
后綴)和同步(具有 sync
后綴)兩種操作方式,而供開發(fā)者選擇
二、文件知識(shí)
在計(jì)算機(jī)中有關(guān)于文件的知識(shí):
- 權(quán)限位 mode
- 標(biāo)識(shí)位 flag
- 文件描述為 fd
權(quán)限位 mode
針對(duì)文件所有者、文件所屬組、其他用戶進(jìn)行權(quán)限分配,其中類型又分成讀、寫和執(zhí)行,具備權(quán)限位4、2、1,不具備權(quán)限為0
如在linux
查看文件權(quán)限位:
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
為文件夾,-
為文件,后九位就代表當(dāng)前用戶、用戶所屬組和其他用戶的權(quán)限位,按每三位劃分,分別代表讀(r)、寫(w)和執(zhí)行(x),- 代表沒有當(dāng)前位對(duì)應(yīng)的權(quán)限
標(biāo)識(shí)位
標(biāo)識(shí)位代表著對(duì)文件的操作方式,如可讀、可寫、即可讀又可寫等等,如下表所示:
符號(hào) | 含義 |
---|---|
r | 讀取文件,如果文件不存在則拋出異常。 |
r+ | 讀取并寫入文件,如果文件不存在則拋出異常。 |
rs | 讀取并寫入文件,指示操作系統(tǒng)繞開本地文件系統(tǒng)緩存。 |
w | 寫入文件,文件不存在會(huì)被創(chuàng)建,存在則清空后寫入。 |
wx | 寫入文件,排它方式打開。 |
w+ | 讀取并寫入文件,文件不存在則創(chuàng)建文件,存在則清空后寫入。 |
wx+ | 和 w+ 類似,排他方式打開。 |
a | 追加寫入,文件不存在則創(chuàng)建文件。 |
ax | 與 a 類似,排他方式打開。 |
a+ | 讀取并追加寫入,不存在則創(chuàng)建。 |
ax+ | 與 a+ 類似,排他方式打開。 |
文件描述為 fd
操作系統(tǒng)會(huì)為每個(gè)打開的文件分配一個(gè)名為文件描述符的數(shù)值標(biāo)識(shí),文件操作使用這些文件描述符來識(shí)別與追蹤每個(gè)特定的文件
Window
系統(tǒng)使用了一個(gè)不同但概念類似的機(jī)制來追蹤資源,為方便用戶,NodeJS
抽象了不同操作系統(tǒng)間的差異,為所有打開的文件分配了數(shù)值的文件描述符
在 NodeJS
中,每操作一個(gè)文件,文件描述符是遞增的,文件描述符一般從 3
開始,因?yàn)榍懊嬗?nbsp;0
、1
、2
三個(gè)比較特殊的描述符,分別代表 process.stdin
(標(biāo)準(zhǔn)輸入)、process.stdout
(標(biāo)準(zhǔn)輸出)和 process.stderr
(錯(cuò)誤輸出)
三、方法
下面針對(duì)fs
模塊常用的方法進(jìn)行展開:
- 文件讀取
- 文件寫入
- 文件追加寫入
- 文件拷貝
- 創(chuàng)建目錄
文件讀取
fs.readFileSync
同步讀取,參數(shù)如下:
- 第一個(gè)參數(shù)為讀取文件的路徑或文件描述符
- 第二個(gè)參數(shù)為 options,默認(rèn)值為 null,其中有 encoding(編碼,默認(rèn)為 null)和 flag(標(biāo)識(shí)位,默認(rèn)為 r),也可直接傳入 encoding
結(jié)果為返回文件的內(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
的前兩個(gè)參數(shù)相同,最后一個(gè)參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有兩個(gè)參數(shù) err
(錯(cuò)誤)和 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
同步寫入,有三個(gè)參數(shù):
- 第一個(gè)參數(shù)為寫入文件的路徑或文件描述符
- 第二個(gè)參數(shù)為寫入的數(shù)據(jù),類型為 String 或 Buffer
- 第三個(gè)參數(shù)為 options,默認(rèn)值為 null,其中有 encoding(編碼,默認(rèn)為 utf8)、 flag(標(biāo)識(shí)位,默認(rèn)為 w)和 mode(權(quán)限位,默認(rèn)為 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
的前三個(gè)參數(shù)相同,最后一個(gè)參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有一個(gè)參數(shù) err
(錯(cuò)誤),回調(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ù)如下:
- 第一個(gè)參數(shù)為寫入文件的路徑或文件描述符
- 第二個(gè)參數(shù)為寫入的數(shù)據(jù),類型為 String 或 Buffer
- 第三個(gè)參數(shù)為 options,默認(rèn)值為 null,其中有 encoding(編碼,默認(rèn)為 utf8)、 flag(標(biāo)識(shí)位,默認(rèn)為 a)和 mode(權(quán)限位,默認(rèn)為 0o666),也可直接傳入 encoding
const fs = require("fs"); fs.appendFileSync("3.txt", " world"); let data = fs.readFileSync("3.txt", "utf8");
appendFile
異步追加寫入方法 appendFile
與 appendFileSync
的前三個(gè)參數(shù)相同,最后一個(gè)參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有一個(gè)參數(shù) err
(錯(cuò)誤),回調(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ù)為一個(gè)目錄的路徑,沒有返回值,在創(chuàng)建目錄的過程中,必須保證傳入的路徑前面的文件目錄都存在,否則會(huì)拋出異常
// 假設(shè)已經(jīng)有了 a 文件夾和 a 下的 b 文件夾 fs.mkdirSync("a/b/c")
mkdir
異步創(chuàng)建,第二個(gè)參數(shù)為回調(diào)函數(shù)
fs.mkdir("a/b/c", err => { if (!err) console.log("創(chuàng)建成功"); });
以上就是node里的filesystem模塊文件讀寫操作詳解的詳細(xì)內(nèi)容,更多關(guān)于node filesystem文件讀寫操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用nodeJs anywhere搭建本地服務(wù)器環(huán)境的方法
今天小編就為大家分享一篇利用nodeJs anywhere搭建本地服務(wù)器環(huán)境的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05node使用async_hooks模塊進(jìn)行請(qǐng)求追蹤
這篇文章主要介紹了node使用async_hooks模塊進(jìn)行請(qǐng)求追蹤,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01nodejs和php實(shí)現(xiàn)圖片訪問實(shí)時(shí)處理
這篇文章主要為大家詳細(xì)介紹了nodejs和php分別實(shí)現(xiàn)圖片訪問實(shí)時(shí)處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01NodeJs項(xiàng)目中關(guān)閉ESLint的方法
ESLint是一個(gè)用來識(shí)別 ECMAScript 并且按照規(guī)則給出報(bào)告的代碼檢測(cè)工具,使用它可以避免低級(jí)錯(cuò)誤和統(tǒng)一代碼的風(fēng)格。這篇文章主要介紹了NodeJs項(xiàng)目中關(guān)閉ESLint的方法,需要的朋友可以參考下2018-08-08Node.js使用SQLite數(shù)據(jù)庫(kù)方法大全
Node.js是一種流行的JavaScript運(yùn)行時(shí),提供了許多有用的模塊和庫(kù)來構(gòu)建Web應(yīng)用程序,而SQLite是一種嵌入式關(guān)系型數(shù)據(jù)庫(kù),它可以運(yùn)行在各種操作系統(tǒng)上,包括Windows、Linux和Mac OS X等,在Node.js中,可以通過安裝sqlite3模塊來訪問SQLite數(shù)據(jù)庫(kù)2023-10-10手把手教你通過nodejs快速搭建一個(gè)服務(wù)器
這篇文章主要給大家介紹了關(guān)于如何通過nodejs快速搭建一個(gè)服務(wù)器的相關(guān)資料,在node.js中創(chuàng)建一個(gè)服務(wù)器非常簡(jiǎn)單,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10