本篇文章帶大家了解一下Node.js中的文件系統(tǒng)模塊馒过,介紹一下使用文件系統(tǒng)模塊(fs模塊)的方法割卖,并介紹一些最常見和最有用的 fs 方法桨仿。
文件系統(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)入 fs
和 path
模塊后山林,在文件中編寫以下代碼:
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)容今阳。
如果比較 writeFile
和 appendFile
這兩種方法,我們可以發(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ゾ恕!