Node.js中文件系統(tǒng)fs模塊的使用及常用接口

fs是filesystem的縮寫,該模塊提供本地文件的讀寫能力,基本上是POSIX文件操作命令的簡單包裝。但是,這個(gè)模塊幾乎對(duì)所有操作提供異步和同步兩種操作方式,供開發(fā)者選擇。
JavaScript 的是沒有操作文件的能力,但是 Node 是可以做到的,Node 提供了操作文件系統(tǒng)模塊,是 Node 中使用非常重要和高頻的模塊,是絕對(duì)要掌握的一個(gè)模塊系統(tǒng)。
fs 模塊提供了非常多的接口,這里主要說一下一些常用的接口。
1.常用API快速復(fù)習(xí)
fs.stat 檢測(cè)是文件還是目錄
const fs = require('fs')
fs.stat('hello.js', (error,stats)=>{
if(error) {
console.log(error)
} else {
console.log(stats)
console.log(`文件:${stats.isFile()}`)
console.log(`目錄:${stats.isDirectory()}`)
}
})
fs.mkdir 創(chuàng)建目錄
const fs = require('fs')
fs.mkdir('logs', error => {
if(error) {
console.log(error)
} else {
console.log('目錄創(chuàng)建成功!')
}
})
fs.rmdir 刪除目錄
const fs = require('fs')
fs.rmdir('logs', error => {
if(error) {
console.log(error)
} else {
console.log('成功刪除了目錄 logs')
}
})
fs.writeFile 創(chuàng)建寫入文件
const fs = require('fs')
fs.writeFile('logs/hello.log','您好~\n', error => {
if(error) {
console.log(error)
} else {
console.log('成功寫入文件');
}
})
fs.appendFile 追加文件
const fs = require('fs')
fs.appendFile('logs/hello.log','hello~\n', error => {
if(error) {
console.log(error)
} else {
console.log('成功寫入文件');
}
})
fs.readFile 讀取文件
const fs = require('fs')
fs.readFile('logs/hello.log','utf-8', (error, data) => {
if(error) {
console.log(error)
} else {
console.log(data);
}
})
fs.unlink 刪除文件
const fs = require('fs')
fs.unlink(`logs/${file}`, error => {
if(error) {
console.log(error)
} else {
console.log(`成功刪除了文件: ${file}`)
}
})
fs.readdir 讀取目錄
const fs = require('fs')
fs.readdir('logs', (error, files) => {
if(error) {
console.log(error)
} else {
console.log(files);
}
})
fs.rename 重命名,還可以更改文件的存放路徑
const fs = require('fs')
fs.rename('js/hello.log', 'js/greeting.log', error => {
if(error) {
console.log(error)
} else {
console.log('重命名成功')
}
})
2.第三方NPM包 mkdirp 的使用
mkdirp 不僅可以創(chuàng)建文件夾,還可以創(chuàng)建多層的文件夾,類似 mkdir -p 命令
midir -p tmp/foo/bar/baz
上述命令也可以在當(dāng)前目錄創(chuàng)建多層幾文件夾。
如下代碼在當(dāng)前目錄生成多層級(jí)文件夾
const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made => console.log(`創(chuàng)建目錄于: ${made}`))
// 創(chuàng)建目錄于: /Users/zhangbing/github/CodeTest/Node/fs/tmp
結(jié)果

3.實(shí)戰(zhàn)舉例
實(shí)戰(zhàn)1
判斷服務(wù)器上面有沒有 upload 目錄。如果沒有就創(chuàng)建這個(gè)目錄,如果有的話不做操作
const fs = require('fs')
const path = './upload'
fs.stat(path, (err, data) => {
if(err) {
// 執(zhí)行創(chuàng)建目錄
mkdir(path)
return
}
if(data.isDirectory()) {
console.log('upload目錄存在');
}else{
// 首先刪除文件,再去執(zhí)行創(chuàng)建目錄
fs.unlink(path, err => {
if(!err) {
mkdir(path)
}
})
}
})
function mkdir(dir) {
fs.mkdir(dir, err => {
if(err) {
console.log(err);
return
}
})
}
實(shí)戰(zhàn)2
wwwroot 文件夾下面有 images css js 以及 index.html, 找出 wwwroot 目錄下面的所有的目錄,然后放在一個(gè)數(shù)組中
使用同步方法方式
const fs = require('fs')
const path = './wwwroot'
const dirArr = []
const dirs = fs.readdirSync(path)
dirs.forEach(item => {
if(fs.statSync(path + '/' + item).isDirectory()) {
dirArr.push(item)
}
})
console.log('dirArr', dirArr)
// dirArr [ 'css', 'images', 'js' ]
使用 async/await 方式
const fs = require('fs')
const path = './wwwroot'
const dirArr = []
function isDir(path) {
return new Promise((resolve, reject) => {
fs.stat(path, (error, stats) => {
if(error) {
console.log(error)
reject(error)
return
}
if(stats.isDirectory()) {
resolve(true)
} else {
resolve(false)
}
})
})
}
function main(){
fs.readdir(path, async (error, data) => {
if(error) {
console.log(error)
return
} else {
for(let i = 0; i < data.length; i++) {
if(await isDir(path + '/' + data[i])) {
dirArr.push(data[i])
}
}
console.log('dirArr', dirArr)
}
})
}
main() // dirArr [ 'css', 'images', 'js' ]
4.管道流
管道提供了一個(gè)輸出流到輸入流的機(jī)制。通常我們用于從一個(gè)流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個(gè)流中。以下實(shí)例我們通過讀取一個(gè)文件內(nèi)容并將內(nèi)容寫入到另外一個(gè)文件中。
const fs = require("fs")
//創(chuàng)建一個(gè)可讀流
const readerStream = fs.createReadStream('input.txt')
//創(chuàng)建一個(gè)可寫流
const writerStream = fs.createWriteStream('output.txt')
//管道讀寫操作
//讀取input.txt文件內(nèi)容,并將內(nèi)容寫入到output.txt文件中
readerStream.pipe(writerStream)
console.log("程序執(zhí)行完畢")
fs.createReadStream 從文件流中讀取數(shù)據(jù)
const fs = require('fs')
const fileReadStream = fs.fileReadStream('demo1.js')
let count = 0
let str = ''
fileReadStream.on('data', chunk => {
console.log(`${++count}接收到:${chunk.length}`)
str += chunk
})
fileReadStream.on('end', () => {
console.log('---結(jié)束---')
console.log(count + ',' + star)
})
fileReadStream.on('error', error => {
console.log(error)
})
fs.createWriteStream 寫入文件
const fs = require("fs")
const data ='我是從數(shù)據(jù)庫獲取的數(shù)據(jù),我要保存起來'
//創(chuàng)建一個(gè)可以寫入的流,寫入到文件output.txt中
const writerStream = fs.createWriteStream('output.txt')
//使用utf8編碼寫入數(shù)據(jù)
writerStream.write(data,'UTF8')
//標(biāo)記文件末尾
writerStream.end()
//處理流事件-->finish事件
writerStream.on('finish', () => {
/*finish-所有數(shù)據(jù)已被寫入到底層系統(tǒng)時(shí)觸發(fā)。*/
console.log("寫入完成。")
})
writerStream.on('error', err => {
console.log(err.stack);
})
console.log("程序執(zhí)行完畢")
實(shí)戰(zhàn):復(fù)制圖片在項(xiàng)目根目錄有一張圖片 2020.png ,把它復(fù)制到 /wwwroot/images 中

代碼如下
const fs = require("fs")
const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./wwwroot/images/2021.png')
readStream.pipe(writeStream)
需要特別注意的是, fs.createWriteStream 要寫入的目錄一定要帶上要復(fù)制的文件名,也就是不能寫成 fs.createWriteStream('./wwwroot/images/') 否則在 macOS 下會(huì)報(bào)如下錯(cuò)誤:
Error: EISDIR: illegal operation on a directory, open <directory>
本文源碼: https://github.com/dunizb/CodeTest/tree/master/Node/fs
總結(jié)
到此這篇關(guān)于Node.js中fs模塊的使用及常用接口的文章就介紹到這了,更多相關(guān)node.js fs 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Node.js?內(nèi)置模塊fs文件系統(tǒng)操作示例詳解
- 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 fs模塊(文件模塊)創(chuàng)建、刪除目錄(文件)讀取寫入文件流的方法
- node.js基于fs模塊對(duì)系統(tǒng)文件及目錄進(jìn)行讀寫操作的方法詳解
- 淺談Node.js:fs文件系統(tǒng)模塊
- Node.js?中?fs?模塊的高級(jí)用法實(shí)例詳解
相關(guān)文章
npm?list輸出結(jié)果包含extraneous標(biāo)志記錄分析
這篇文章主要為大家介紹了npm?list輸出結(jié)果包含extraneous標(biāo)志記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
nodemailer郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn)
郵箱注冊(cè)是常見的功能,通常需要發(fā)送郵箱驗(yàn)證碼驗(yàn)證,本文就來介紹一下nodemailer郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
使用?Node-RED對(duì)?MQTT?數(shù)據(jù)流處理
本文將介紹使用 Node-RED 連接到 MQTT 服務(wù)器,并對(duì) MQTT 數(shù)據(jù)進(jìn)行過濾和處理后再將其發(fā)送至 MQTT 服務(wù)器的完整操作流程。讀者可以快速了解如何使用 Node-RED 對(duì) MQTT 數(shù)據(jù)進(jìn)行簡單的流處理2022-05-05

