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