淺析Node.js中文件系統(tǒng)fs模塊的常用方法(轉(zhuǎn)載)

本篇文章帶大家了解一下Node.js中的文件系統(tǒng)模塊馒过,介紹一下使用文件系統(tǒng)模塊(fs模塊)的方法割卖,并介紹一些最常見和最有用的 fs 方法桨仿。

image

文件系統(tǒng)模塊(簡稱 fs)允許我們訪問計(jì)算機(jī)上的文件系統(tǒng)并與之交互√粤冢【推薦學(xué)習(xí):《nodejs 教程》】

使用 fs 模塊似将,我們可以執(zhí)行以下操作:

  • 創(chuàng)建文件和目錄
  • 修改文件和目錄
  • 刪除文件和目錄
  • 讀取文件和目錄的內(nèi)容
  • ...

建議:文件系統(tǒng)模塊比較復(fù)雜,建議查看官方文檔痹雅,你可以看到所有的方法仰担。

本文將向您介紹最常見和最有用的 fs 方法。事不宜遲绩社,讓我們看看這些方法是什么摔蓝。

如何使用 fs

文件系統(tǒng)模塊是一個核心的 Node.js 模塊赂苗。這意味著我們不必安裝它。我們唯一需要做的就是將 fs 模塊導(dǎo)入到自己的文件中贮尉。

因此拌滋,在文件頂部添加:

const fs = require('fs')

現(xiàn)在,我們可以使用前綴 fs 從文件系統(tǒng)模塊調(diào)用任何方法猜谚。

或者败砂,我們可以只從 fs API 導(dǎo)入所需的方法,如下所示:

const { writeFile, readFile } = require('fs')

注意:為了方便起見魏铅,我們還需要導(dǎo)入 path 模塊吠卷。它是另一個核心 Node.js 模塊,它允許我們使用文件和目錄路徑沦零。

導(dǎo)入 fs 模塊后祭隔,在文件中添加:

const path = require('path')

使用文件系統(tǒng)模塊時,path 模塊不是必需的路操。但它對我們有很大的幫助疾渴!

同步與異步

需要注意的是,默認(rèn)情況下屯仗,所有 fs 方法都是異步的搞坝。但是,我們可以通過在方法末尾添加 Sync 來使用同步版本魁袜。

例如桩撮,writeFile 方法的同步版本為 writeFileSync。同步方法將同步的完成代碼峰弹,因此它們阻塞了主線程店量。阻塞 Node.js 中的主線程被認(rèn)為是不好的做法,我們不應(yīng)該這么做鞠呈。

因此融师,以下我們都將使用文件系統(tǒng)模塊中的異步方法。

寫入文件

要從 Node.js 應(yīng)用程序?qū)懭胛募狭撸埵褂?writeFile 方法旱爆。

writeFile 方法至少接受以下參數(shù):

  • 文件名
  • 內(nèi)容
  • 回調(diào)

如果指定的文件已經(jīng)存在,它會將舊內(nèi)容替換為您作為參數(shù)提供的內(nèi)容窘茁。如果指定的文件不存在怀伦,則創(chuàng)建一個新文件。

導(dǎo)入 fspath 模塊后山林,在文件中編寫以下代碼:

fs.writeFile('content.txt', 'All work and no play makes Jack a dull boy!', err => {
  if (err) throw err

  process.stdout.write('創(chuàng)建成功!')
})

上面的代碼將創(chuàng)建了一個名為 content.txt 的新文件房待,并添加了文本 All work and no play makes Jack a dull boy! 作為內(nèi)容。如果存在任何錯誤,回調(diào)函數(shù)將拋出該錯誤吴攒。否則,它將向控制臺輸出文件創(chuàng)建成功砂蔽。

writeFile 還有其他變體洼怔,例如:

  • fs.writeFileSync — 同步寫入文件
  • fsPromises.writeFile — 使用基于 Promise 的 API 寫入文件

查看此要點(diǎn):https://gist.github.com/catalinpit/571ba06c06214b5c8744036c6500af92

從文件中讀取

在讀取文件之前,需要創(chuàng)建并存儲文件的路徑左驾。path 模塊的路徑在這里很方便镣隶。

使用 join 模塊中的 path 方法,您可以創(chuàng)建文件路徑诡右,如下所示:

const filePath = path.join(process.cwd(), 'content.txt')

第一個參數(shù) process.cwd() 返回當(dāng)前工作目錄“财瘢現(xiàn)在您已經(jīng)有了文件路徑,可以讀取文件的內(nèi)容了帆吻。

在文件中編寫以下代碼:

fs.readFile(filePath, (error, content) => {
  if (error) throw error

  process.stdout.write(content)
})

readFile 方法至少接受兩個參數(shù):

  • 文件的路徑
  • 回調(diào)

如果有錯誤域那,它會拋出一個錯誤。否則猜煮,它會在終端中輸出文件內(nèi)容次员。

readFile 還有其他變體,例如:

  • fs.readFileSync — 同步寫入文件
  • fsPromises.readFile — 使用基于 Promise 的 API 寫入文件

查看此要點(diǎn):https://gist.github.com/catalinpit/badc2a539a44412892a0e05a9575d54d

讀取目錄的內(nèi)容

在目錄中顯示文件與讀取文件內(nèi)容非常相似王带。但是淑蔚,不是傳遞文件路徑,而是傳遞當(dāng)前工作目錄(我們可以傳遞任何其他目錄)愕撰。

然后刹衫,傳遞一個回調(diào)函數(shù)來處理響應(yīng)。在文件中編寫以下代碼:

fs.readdir(process.cwd(), (error, files) => {
  if (error) throw error

  console.log(files)
})

到目前為止搞挣,我們只使用 process.stdout.write 將內(nèi)容輸出到終端带迟。但是,您可以簡單地使用 console.log囱桨,就像上面的代碼片段一樣邮旷。

如果運(yùn)行該應(yīng)用程序,我們應(yīng)該會得到一個包含目錄中所有文件的數(shù)組蝇摸。

查看此要點(diǎn):https://gist.github.com/catalinpit/f82c4e6ae3acd5d97efdecb0bc67979e

刪除文件

文件系統(tǒng)模塊有一種方法婶肩,允許您刪除文件。但是貌夕,需要注意的是律歼,它只適用于文件,不適用于目錄啡专。

當(dāng)以文件路徑作為參數(shù)調(diào)用 unlink 方法時险毁,它將刪除該文件。將以下代碼段添加到文件中:

fs.unlink(filePath, error => {
  if (error) throw error

  console.log('文件已刪除!')
})

如果您重新運(yùn)行代碼,您的文件將被刪除畔况!

查看此要點(diǎn):https://gist.github.com/catalinpit/b1201434218c400f77e042109bfce99e

創(chuàng)建目錄

我們可以使用 mkdir 方法異步創(chuàng)建目錄鲸鹦。在文件中編寫以下代碼:

fs.mkdir(`${process.cwd()}/myFolder/secondFolder`, { recursive: true }, (err) => {
  if (err) throw err

  console.log('已成功創(chuàng)建文件夾!')
})

首先,要在當(dāng)前工作目錄中創(chuàng)建一個新文件夾跷跪。如前所述馋嗜,您可以使用 cwd() 方法從 process 對象獲取當(dāng)前工作目錄。

然后吵瞻,傳遞要創(chuàng)建的一個或多個文件夾葛菇。但是,這并不意味著您必須在當(dāng)前工作目錄中創(chuàng)建新文件夾橡羞。你可以在任何地方創(chuàng)建它們眯停。

現(xiàn)在,第二個參數(shù)是遞歸選項(xiàng)卿泽。如果未將其設(shè)置為 true莺债,則無法創(chuàng)建多個文件夾。如果將 recursive 選項(xiàng)設(shè)置為 false签夭,上述代碼將給出一個錯誤九府。試試看!

但是覆致,如果您只想創(chuàng)建一個文件夾侄旬,則無需將 recursive 選項(xiàng)設(shè)置為 true

以下代碼可以正常工作煌妈!

fs.mkdir(`${process.cwd()}/myFolder`, err => {
  if (err) throw err

  console.log('已成功創(chuàng)建文件夾!')
});

因此儡羔,我想強(qiáng)調(diào)使用 recursive。如果要在文件夾中創(chuàng)建文件夾璧诵,則需要將其設(shè)置為 true汰蜘。它將創(chuàng)建所有文件夾,即使它們不存在之宿。

另一方面族操,如果您只想創(chuàng)建一個文件夾,可以將其保留為 false比被。

查看此要點(diǎn):https://gist.github.com/catalinpit/09bad802541102c0cce2a2e4c3985066

刪除目錄

刪除目錄的邏輯類似于創(chuàng)建目錄色难。如果您查看為創(chuàng)建目錄而編寫的代碼和下面的代碼,您會發(fā)現(xiàn)相似之處等缀。

因此枷莉,在文件中編寫以下代碼:

fs.rmdir(`${process.cwd()}/myFolder/`, { recursive: true }, err => {
  if (err) throw err

  console.log('已成功刪除文件夾!')
})

使用文件系統(tǒng)模塊中的 rmdir 方法,并傳遞以下參數(shù):

  • 要刪除的目錄
  • 遞歸屬性
  • 回調(diào)

如果將 recursive 屬性設(shè)置為 true尺迂,它將刪除文件夾及其內(nèi)容笤妙。請務(wù)必注意冒掌,如果文件夾中包含內(nèi)容,則需要將其設(shè)置為 true蹲盘。否則股毫,您將得到一個錯誤。

以下代碼段僅在文件夾為空時有效:

fs.rmdir(`${process.cwd()}/myFolder/`, err => {
  if (err) throw err

  console.log('已成功刪除文件夾!')
})

如果 myFolder 中有其他文件和/或文件夾召衔,如果未傳遞 { recursive: true }铃诬,則會出現(xiàn)錯誤。

知道何時使用 recursive 選項(xiàng)以及何時不避免問題是很重要的薄嫡。

查看此要點(diǎn):https://gist.github.com/catalinpit/a8cb6aca75cef8d6ac5043eae9ba22ce

目錄/文件重命名

使用 fs 模塊氧急,您可以重命名目錄和文件颗胡。下面的代碼片段顯示了如何使用 rename 方法進(jìn)行此操作毫深。

// 重命名一個目錄fs.rename(`${process.cwd()}/myFolder/secondFolder`, `${process.cwd()}/myFolder/newFolder`, err => {
  if (err) throw err

  console.log('目錄重命名!')
});// 重命名一個文件fs.rename(`${process.cwd()}/content.txt`, `${process.cwd()}/newFile.txt`, err => {
  if (err) throw err

  console.log('文件重命名!')
});

rename 方法包含三個參數(shù):

  • 第一個參數(shù)是現(xiàn)有的文件夾/文件
  • 第二個參數(shù)是新名稱
  • 回調(diào)

因此,要重命名文件或目錄毒姨,我們需要傳遞當(dāng)前文件/目錄的名稱和新名稱哑蔫。運(yùn)行應(yīng)用程序后,應(yīng)更新目錄/文件的名稱弧呐。

需要注意的是闸迷,如果新路徑已經(jīng)存在(例如,文件/文件夾的新名稱)俘枫,它將被覆蓋腥沽。因此,請確保不要錯誤地覆蓋現(xiàn)有文件/文件夾鸠蚪。

查看此要點(diǎn):https://gist.github.com/catalinpit/5c3e7c6ae39d09996ff67175a719122e

向文件中添加內(nèi)容

我們還可以使用 appendFile 方法向現(xiàn)有文件添加新內(nèi)容今阳。

如果比較 writeFileappendFile 這兩種方法,我們可以發(fā)現(xiàn)它們是相似的茅信。傳遞文件路徑盾舌、內(nèi)容和回調(diào)。

fs.appendFile(filePath, '\nAll work and no play makes Jack a dull boy!', err => {
  if (err) throw err

  console.log('All work and no play makes Jack a dull boy!')
})

上面的代碼片段演示了如何向現(xiàn)有文件添加新內(nèi)容蘸鲸。如果運(yùn)行應(yīng)用程序并打開文件妖谴,您應(yīng)該會看到其中的新內(nèi)容。

查看此要點(diǎn):https://gist.github.com/catalinpit/7c8d40db53dea9e6831f9ee89d92475c

原文地址:https://juejin.cn/post/6991848361527607327
作者:lio_zero

本文轉(zhuǎn)載自:https://www.php.cn/js-tutorial-480845.html

更多編程相關(guān)知識酌摇,請?jiān)L問:編程視頻Oゾ恕!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窑多,一起剝皮案震驚了整個濱河市铸史,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怯伊,老刑警劉巖琳轿,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件判沟,死亡現(xiàn)場離奇詭異,居然都是意外死亡崭篡,警方通過查閱死者的電腦和手機(jī)挪哄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琉闪,“玉大人迹炼,你說我怎么就攤上這事〉弑校” “怎么了斯入?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛀蜜。 經(jīng)常有香客問我刻两,道長,這世上最難降的妖魔是什么滴某? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任磅摹,我火速辦了婚禮,結(jié)果婚禮上霎奢,老公的妹妹穿的比我還像新娘户誓。我一直安慰自己,他們只是感情好幕侠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布帝美。 她就那樣靜靜地躺著,像睡著了一般晤硕。 火紅的嫁衣襯著肌膚如雪悼潭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天窗骑,我揣著相機(jī)與錄音女责,去河邊找鬼。 笑死创译,一個胖子當(dāng)著我的面吹牛抵知,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播软族,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刷喜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了立砸?” 一聲冷哼從身側(cè)響起掖疮,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颗祝,沒想到半個月后浊闪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恼布,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年搁宾,在試婚紗的時候發(fā)現(xiàn)自己被綠了折汞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖腿,死狀恐怖爽待,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翩腐,我是刑警寧澤鸟款,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站茂卦,受9級特大地震影響何什,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疙筹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一富俄、第九天 我趴在偏房一處隱蔽的房頂上張望禁炒。 院中可真熱鬧而咆,春花似錦、人聲如沸幕袱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽们豌。三九已至涯捻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間望迎,已是汗流浹背障癌。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辩尊,地道東北人涛浙。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像摄欲,于是被迫代替她去往敵國和親轿亮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容