Node.js?內(nèi)置模塊fs文件系統(tǒng)操作示例詳解
File system 文件系統(tǒng)
fs(File system,文件系統(tǒng)) 是 node 的一個(gè)內(nèi)置模塊,可用于在多種操作系統(tǒng)中(Windows 、macOS 等)對(duì)文件進(jìn)行操作。查閱 node 的官方文檔,可以看到 File system 下有非常多的 API:
它們有的用于對(duì)文件進(jìn)行讀寫操作,有的用于對(duì)文件夾操作等,且都提供同步、異步和 Promise 這 3 種操作方式。下面舉幾個(gè)常用的 API 為例,進(jìn)行說明。
操作文件
讀取文件
同步讀取
fs.readFileSync()
用于同步 (Sync) 讀取文件,直接傳入要讀取的文件的路徑或文件描述符即可:
// 代碼塊 1.1.1 const fs = require('fs') // 同步讀取 const resSync = fs.readFileSync('./test.txt') console.log(resSync) console.log('看看會(huì)不會(huì)阻塞')
執(zhí)行結(jié)果如下,第 6 行的打印是在第 5 行之后,說明同步操作會(huì)阻塞后續(xù)代碼的運(yùn)行:
resSync
的結(jié)果是 Buffer
對(duì)象,本質(zhì)上是二進(jìn)制的內(nèi)容,只是以十六進(jìn)制來展示。如果想看到文本內(nèi)容,可以對(duì)結(jié)果使用 toString()
進(jìn)行轉(zhuǎn)換:console.log(resSync.toString())
,或者給 fs.readFileSync()
傳入第 2 個(gè)參數(shù) —— 一個(gè)用于指定配置的可選對(duì)象,該對(duì)象有 2 個(gè)屬性:
encoding
,默認(rèn)值為null
,也就是結(jié)果顯示為 buffer,想顯示文本可以改為'utf-8'
(或'utf8'
);flag
,讀取文件時(shí)默認(rèn)值為'r'
,更多 flag 相關(guān)信息可查看官方文檔。
// 代碼塊 1.1.2 const resSync = fs.readFileSync('./test.txt', { encoding: 'utf-8', flag: 'r' }) console.log(resSync) console.log('看看會(huì)不會(huì)阻塞')
現(xiàn)在看到的 resSync
就為一個(gè)字符串了:
異步讀取 - Callback
fs.readFile()
用于異步讀取文件,其可以傳入 3 個(gè)參數(shù),前兩個(gè)與 fs.readFileSync()
相同,第 3 個(gè)參數(shù)為一個(gè)回調(diào)函數(shù),當(dāng)獲取到讀取結(jié)果時(shí)被調(diào)用:
// 代碼塊 1.2.1 fs.readFile( './test.txt', { encoding: 'utf-8' }, (err, data) => { if (!err) console.log(data) } ) console.log('看看會(huì)不會(huì)阻塞')
執(zhí)行結(jié)果如下,可以看到異步讀取不會(huì)阻塞后續(xù)代碼的執(zhí)行:
異步讀取 - Promise
fs.promises.readFile()
也是用于異步讀取文件,但可以避免在采用回調(diào)函數(shù)的方式獲取結(jié)果時(shí)容易產(chǎn)生的回調(diào)地獄:
// 代碼塊 1.3.1 fs.promises .readFile('./test.txt', { encoding: 'utf-8' }) .then(res => { console.log(res) }) .catch(err => console.log(err))
寫入文件
寫入文件也有同步異步的方法,下面以異步 - callback 的 api fs.writeFile()
為例。
其第 1 個(gè)參數(shù)可以是文件的地址或文件描述符,如果文件不存在,則會(huì)進(jìn)行創(chuàng)建;
第 2 個(gè)參數(shù)為要寫入的內(nèi)容;
第 3 個(gè)參數(shù)為用于指定配置的可選對(duì)象,其中有之前介紹過的兩個(gè)屬性 encoding
和 flag
,只不過這里 encoding
的默認(rèn)值為 'utf8'
,flag
的默認(rèn)值為 'w'
,即默認(rèn)寫入的內(nèi)容會(huì)覆蓋原有的內(nèi)容,如果是想在原內(nèi)容后追加寫入,則可以改為 'a'
(append);
第 4 個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),在寫入操作執(zhí)行結(jié)束后調(diào)用,如果寫入發(fā)生錯(cuò)誤,就會(huì)把錯(cuò)誤信息作為參數(shù)傳入:
fs.writeFile( './test.txt', 'Hello Juejin', { encoding: 'utf8', flag: 'w' }, err => { if (err) { console.log(err) return } console.log('寫入成功') } )
文件描述符
前面說到,讀取文件的這 3 種方法,傳入的第一個(gè)參數(shù)除了文件的路徑外,還可以是文件描述符(file descriptor)。在常見的操作系統(tǒng)中,內(nèi)核對(duì)于每個(gè)進(jìn)程都維護(hù)著一張當(dāng)前打開的文件和資源的表格,而每個(gè)打開的文件都會(huì)被分配一個(gè)簡(jiǎn)單的數(shù)字用于標(biāo)識(shí)和跟蹤文件,雖然不同的操作系統(tǒng)具體實(shí)現(xiàn)可能不同,但 node 幫我們處理了差異,為每個(gè)打開的文件分配了個(gè)數(shù)字類型的文件描述符。
我們可以通過 fs.open()
打開一個(gè)文件來獲取文件描述符:
// 代碼塊 2.1.1 fs.open('./test.txt', (err, fd) => { if (!err) { console.log(fd) } })
查看類型可以得知其第 2 個(gè)參數(shù),也就是回調(diào)函數(shù)會(huì)被傳入兩個(gè)參數(shù),第 1 個(gè)為錯(cuò)誤信息 err
,第 2 個(gè)就是文件描述符 fd
:
得到的結(jié)果為 3:
查看文件信息
獲取到了文件描述符,我們可以通過 fs.fstat()
(其第 1 個(gè)參數(shù)只能是 fd)查看文件信息:
fs.open('./test.txt', (err, fd) => { if (err) return fs.fstat(fd, (err, stats) => { if (err) return console.log(stats) fs.close(fd) // 關(guān)閉文件 }) })
打印結(jié)果如下:
操作文件夾
創(chuàng)建文件夾
fs 模塊還能對(duì)文件夾進(jìn)行操作,比如 fs.mkdir()
就可以創(chuàng)建文件夾,mkdir 可以看成是 make directory 的縮寫:
fs.mkdir('./test', err => console.log(err)) // 創(chuàng)建 test 文件夾
讀取文件夾
fs.readdir()
可以用于讀取文件夾,在回調(diào)函數(shù)中會(huì)返回讀取到的文件夾中所包含的文件或文件夾,比如 node 目錄下的結(jié)構(gòu)如下圖所示:
執(zhí)行如下代碼對(duì) node 目錄進(jìn)行讀?。?/p>
// fs.js fs.readdir('../node', (err, files) => { if (!err) console.log(files) })
打印結(jié)果為:[ 'fs.js', 'test', 'test.txt' ]。 如果想獲取更詳細(xì)的信息,可以傳入配置對(duì)象,將 withFileTypes
設(shè)置為 true
:
fs.readdir('../node', { withFileTypes: true }, (err, files) => { if (!err) console.log(files) })
那么打印的結(jié)果就會(huì)通過 Symbol(type)
的值來表明是文件(值為 1
),還是文件夾(值為 2
),關(guān)于 Symbol 的介紹可參看 Symbol 詳解:
現(xiàn)在還有個(gè)問題,就是 test 文件夾里的 index.txt 文件沒有被讀取到,如果想讀取 node 目錄下的所有文件,可以通過遞歸讀?。?/p>
function readDirRecursive(path) { fs.readdir(path, { withFileTypes: true }, (err, files) => { if (err) return files.forEach(item => { if (item.isDirectory()) { readDirRecursive(`${path}/${item.name}`) } else { console.log(item.name) } }) }) } readDirRecursive('../node')
我們也需要將 withFileTypes
設(shè)置為 true
,這樣返回的 files
數(shù)組中的元素才是一個(gè)個(gè)對(duì)象,并且有 name
屬性和 isDirectory()
方法可以判斷是否為文件夾。
重命名文件夾/文件
fs.rename()
可以重命名文件夾或文件,第 1 個(gè)參數(shù)為舊名稱,第 2 個(gè)參數(shù)傳新名稱即可:
fs.rename('./test', './juejin', err => console.log(err))
以上就是Node.js 內(nèi)置模塊fs文件系統(tǒng)操作示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Node.js內(nèi)置模塊fs操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Node.js?操作本地文件及深入了解fs內(nèi)置模塊
- 總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識(shí))
- Node.js中fs模塊的使用方法
- node.js-fs文件系統(tǒng)模塊這是你知道嗎
- Node.js 中的 fs 模塊與Path模塊方法詳解
- Node.js中文件系統(tǒng)fs模塊的使用及常用接口
- Node.js fs模塊(文件模塊)創(chuàng)建、刪除目錄(文件)讀取寫入文件流的方法
- node.js基于fs模塊對(duì)系統(tǒng)文件及目錄進(jìn)行讀寫操作的方法詳解
- 淺談Node.js:fs文件系統(tǒng)模塊
- Node.js?中?fs?模塊的高級(jí)用法實(shí)例詳解
相關(guān)文章
Node.js(v16.13.2版本)安裝及環(huán)境配置的圖文教程
本文主要介紹了Node.js(v16.13.2版本)安裝及環(huán)境配置的圖文教程,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解
這篇文章主要介紹了MQTT Client實(shí)現(xiàn)消息推送功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了MQTT Client實(shí)現(xiàn)消息推送的基本原理、實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2023-05-05Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建
這篇文章主要為大家介紹了Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Nodejs-cluster模塊知識(shí)點(diǎn)總結(jié)及實(shí)例用法
在本篇文章里小編給大家整理的是一篇關(guān)于Nodejs-cluster模塊知識(shí)點(diǎn)總結(jié)及實(shí)例用法,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-12-12Node Puppeteer圖像識(shí)別實(shí)現(xiàn)百度指數(shù)爬蟲的示例
本篇文章主要介紹了Node Puppeteer圖像識(shí)別實(shí)現(xiàn)百度指數(shù)爬蟲的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02Node.js上傳文件功能之服務(wù)端如何獲取文件上傳進(jìn)度
這篇文章主要介紹如何利用progress-stream獲取文件上傳進(jìn)度,以及該組件使用過程中的注意事項(xiàng)2018-02-02npm安裝淘寶鏡像報(bào)錯(cuò)問題解決(npm install -g cnpm)
本文主要介紹了npm安裝淘寶鏡像報(bào)錯(cuò)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01詳解使用Typescript開發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置)
本篇文章主要介紹了詳解使用Typescript開發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10