node之文件系統(tǒng)(fs)(三)

一阅悍、什么是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炝洹汰现!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挂谍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞎饲,更是在濱河造成了極大的恐慌口叙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅战,死亡現(xiàn)場(chǎng)離奇詭異妄田,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)驮捍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)疟呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人东且,你說(shuō)我怎么就攤上這事启具。” “怎么了珊泳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鲁冯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我色查,道長(zhǎng)薯演,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任秧了,我火速辦了婚禮涣仿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘示惊。我一直安慰自己好港,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布米罚。 她就那樣靜靜地躺著钧汹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪录择。 梳的紋絲不亂的頭發(fā)上拔莱,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音隘竭,去河邊找鬼塘秦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛动看,可吹牛的內(nèi)容都是我干的尊剔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菱皆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼须误!你這毒婦竟也來(lái)了挨稿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤京痢,失蹤者是張志新(化名)和其女友劉穎奶甘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祭椰,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臭家,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了方淤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钉赁。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖臣淤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窃爷,我是刑警寧澤邑蒋,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站按厘,受9級(jí)特大地震影響医吊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逮京,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一卿堂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懒棉,春花似錦草描、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妻导,卻和暖如春逛绵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔韭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工术浪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寿酌。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓胰苏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親醇疼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碟联,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345