一阅悍、什么是fs附鸽?
fs模塊是Node.js的一個(gè)核心模塊屯断,專(zhuān)門(mén)用來(lái)操作系統(tǒng)中的文件文虏,常用的操作方式是對(duì)文件的讀取和寫(xiě)入使用require('fs')載入fs模塊,模塊中所有方法都有同步和異步兩種形式殖演。異步方法中回調(diào)函數(shù)的第一個(gè)參數(shù)總是留給異常參數(shù)(exception)氧秘,如果方法成功完成,該參數(shù)為null或undefined趴久。異步寫(xiě)法demo:有一個(gè)回調(diào)函數(shù)丸相。在了解文件操作的方法之前有一些關(guān)于系統(tǒng)和文件的前置知識(shí),如文件的權(quán)限位 mode 彼棍、標(biāo)識(shí)位 flag 灭忠、文件描述符 fd 等,所以在了解 fs 方法的之前會(huì)先將這幾個(gè)概念明確座硕。
二弛作、fs之權(quán)限
文件權(quán)限表:
權(quán)限分配 文件所有者 文件所屬組 其他用戶
權(quán)限項(xiàng) 讀 寫(xiě) 執(zhí)行 讀 寫(xiě) 執(zhí)行 讀 寫(xiě) 執(zhí)行
字符表示 r w x r w x r w x
數(shù)字表示 4 2 1 4 2 1 4 2 1
三、fs之標(biāo)識(shí)
NodeJS 中华匾,標(biāo)識(shí)位代表著對(duì)文件的操作方式映琳,如可讀、可寫(xiě)蜘拉、即可讀又可寫(xiě)等等萨西,例如下面即可說(shuō)明其含義
符號(hào)含義:
r 讀取文件,如果文件不存在則拋出異常旭旭。
r+ 讀取并寫(xiě)入文件谎脯,如果文件不存在則拋出異常。
rs 讀取并寫(xiě)入文件持寄,指示操作系統(tǒng)繞開(kāi)本地文件系統(tǒng)緩存源梭。
w 寫(xiě)入文件,文件不存在會(huì)被創(chuàng)建际看,存在則清空后寫(xiě)入咸产。
wx 寫(xiě)入文件,排它方式打開(kāi)仲闽。
w+ 讀取并寫(xiě)入文件脑溢,文件不存在則創(chuàng)建文件,存在則清空后寫(xiě)入赖欣。
wx+ 和 w+ 類(lèi)似屑彻,排他方式打開(kāi)。
a 追加寫(xiě)入顶吮,文件不存在則創(chuàng)建文件社牲。
ax 與 a 類(lèi)似,排他方式打開(kāi)悴了。
a+ 讀取并追加寫(xiě)入搏恤,不存在則創(chuàng)建违寿。
ax+ 與 a+ 類(lèi)似,排他方式打開(kāi)熟空。
r:讀取
w:寫(xiě)入
s:同步
+:增加相反操作
x:排他方式
r+ 和 w+ 的區(qū)別藤巢,當(dāng)文件不存在時(shí), r+ 不會(huì)創(chuàng)建文件息罗,而會(huì)拋出異常掂咒,但 w+ 會(huì)創(chuàng)建文件;如果文件存在迈喉, r+ 不會(huì)自動(dòng)清空文件绍刮,但 w+ 會(huì)自動(dòng)把已有文件的內(nèi)容清空。
四挨摸、文件操作
1孩革、文件讀取
(1)異步讀取方法 readFile
異步讀取方法 readFile 與 readFileSync 的前兩個(gè)參數(shù)相同,最后一個(gè)參數(shù)為回調(diào)函數(shù)得运,函數(shù)內(nèi)有兩個(gè)參數(shù) err (錯(cuò)誤)和 data (數(shù)據(jù))嫉戚,該方法沒(méi)有返回值,回調(diào)函數(shù)在讀取文件成功后執(zhí)行澈圈。
依然讀取 1.txt 文件:
異步讀取 readFile
var fs=require("fs")
fs.readfile("./1.txt",(err,data)=>{
if(err) throw err
console.log(data) //1.txt里面的數(shù)據(jù)
})
(2)同步讀取readFileSync
readFileSync 有兩個(gè)參數(shù):
第一個(gè)參數(shù)為讀取文件的路徑或文件描述符彬檀;
第二個(gè)參數(shù)為 options ,默認(rèn)值為 null 瞬女,其中有 encoding (編碼窍帝,默認(rèn)為 null )和 flag (標(biāo)識(shí)位,默認(rèn)為 r )诽偷,也可直接傳入 encoding 坤学;
返回值為文件的內(nèi)容,如果沒(méi)有 encoding 报慕,返回的文件內(nèi)容為 Buffer深浮,如果有按照傳入的編碼解析。
若現(xiàn)在有一個(gè)文件名為 1.txt 眠冈,內(nèi)容為 “Hello”飞苇,現(xiàn)在使用 readFileSync 讀取。
同步讀取 readFileSync
const fs = require("fs");
let data = fs.readFileSync("1.txt"); //同時(shí)也可以設(shè)置編碼格式 utf8
console.log(data); // Hello復(fù)制代碼
2蜗顽、打開(kāi)文件 open
open 方法有四個(gè)參數(shù):
path:文件的路徑布卡;
flag:標(biāo)識(shí)位;
mode:權(quán)限位雇盖,默認(rèn) 0o666 忿等;
callback:回調(diào)函數(shù),有兩個(gè)參數(shù) err (錯(cuò)誤)和 fd (文件描述符)崔挖,打開(kāi)文件后執(zhí)行贸街。
異步打開(kāi)文件
var fs=require("fs")
fs.open("./1.txt","r",(err,fd)=>{
console.log(fd)
fs.open("./2.txt","r",(err,fd)=>{
console.log(fd)
})
})
3.關(guān)閉文件 close
close 方法有兩個(gè)參數(shù)庵寞,第一個(gè)參數(shù)為關(guān)閉文件的文件描述符 fd ,第二參數(shù)為回調(diào)函數(shù)薛匪,回調(diào)函數(shù)有一個(gè)參數(shù) err (錯(cuò)誤)皇帮,關(guān)閉文件后執(zhí)行。
異步關(guān)閉文件
var fs=require("fs")
fs.open("./1.txt","r",(err,fd)=>{
fs.close(fd,(err)=>{
console.log("關(guān)閉成功")
})
})
4.讀取文件 read
read
方法與 readFile
不同蛋辈,一般針對(duì)于文件太大,無(wú)法一次性讀取全部?jī)?nèi)容到緩存中或文件大小未知的情況将谊,都是多次讀取到 Buffer 中冷溶。
想了解 Buffer 可以看 NodeJS —— Buffer 解讀 。
read
方法中有六個(gè)參數(shù):
- fd:文件描述符尊浓,需要先使用
open
打開(kāi)逞频; - buffer:要將內(nèi)容讀取到的 Buffer;
- offset:整數(shù)栋齿,向 Buffer 寫(xiě)入的初始位置苗胀;
- length:整數(shù),讀取文件的長(zhǎng)度瓦堵;
- position:整數(shù)基协,讀取文件初始位置;
- callback:回調(diào)函數(shù)菇用,有三個(gè)參數(shù)
err
(錯(cuò)誤)澜驮,bytesRead
(實(shí)際讀取的字節(jié)數(shù)),buffer
(被寫(xiě)入的緩存區(qū)對(duì)象)惋鸥,讀取執(zhí)行完成后執(zhí)行杂穷。
下面讀取一個(gè)1.txt
文件,內(nèi)容為 “hello node”卦绣。
const fs = require("fs");
let buf = Buffer.alloc(6);
// 打開(kāi)文件
fs.open("1.txt", "r", (err, fd) => {
// 讀取文件
fs.read(fd, buf, 0, 3, 0, (err, bytesRead, buffer) => {
console.log(bytesRead);
console.log(buffer);
// 繼續(xù)讀取
fs.read(fd, buf, 3, 3, 3, (err, bytesRead, buffer) => {
console.log(bytesRead);
console.log(buffer);
console.log(buffer.toString());
});
});
});
5.同步磁盤(pán)緩存
fsync 方法有兩個(gè)參數(shù)耐量,第一個(gè)參數(shù)為文件描述符 fd ,第二個(gè)參數(shù)為回調(diào)函數(shù)滤港,回調(diào)函數(shù)中有一個(gè)參數(shù) err (錯(cuò)誤)廊蜒,在同步磁盤(pán)緩存后執(zhí)行。
在使用 write 方法向文件寫(xiě)入數(shù)據(jù)時(shí)溅漾,由于不是一次性寫(xiě)入劲藐,所以最后一次寫(xiě)入在關(guān)閉文件之前應(yīng)先同步磁盤(pán)緩存, fsync 方法將在后面配合 write 一起使用樟凄。
后續(xù)會(huì)繼續(xù)完善聘芜,如果感覺(jué)有幫助請(qǐng)給予一個(gè)寶貴的贊!或者給小編一個(gè)贊賞7炝洹汰现!