如何在Node.js中使用文件系統(tǒng)fs模塊?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
成都創(chuàng)新互聯(lián)公司專(zhuān)注于武穴網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供武穴營(yíng)銷(xiāo)型網(wǎng)站建設(shè),武穴網(wǎng)站制作、武穴網(wǎng)頁(yè)設(shè)計(jì)、武穴網(wǎng)站官網(wǎng)定制、微信小程序定制開(kāi)發(fā)服務(wù),打造武穴網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供武穴網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
fs是filesystem的縮寫(xiě),該模塊提供本地文件的讀寫(xiě)能力,基本上是POSIX文件操作命令的簡(jiǎn)單包裝。但是,這個(gè)模塊幾乎對(duì)所有操作提供異步和同步兩種操作方式,供開(kāi)發(fā)者選擇。
JavaScript 的是沒(méi)有操作文件的能力,但是 Node 是可以做到的,Node 提供了操作文件系統(tǒng)模塊,是 Node 中使用非常重要和高頻的模塊,是絕對(duì)要掌握的一個(gè)模塊系統(tǒng)。
1.常用API快速?gòu)?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)建寫(xiě)入文件
const fs = require('fs') fs.writeFile('logs/hello.log','您好~\n', error => { if(error) { console.log(error) } else { console.log('成功寫(xiě)入文件'); } })
fs.appendFile 追加文件
const fs = require('fs') fs.appendFile('logs/hello.log','hello~\n', error => { if(error) { console.log(error) } else { console.log('成功寫(xiě)入文件'); } })
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)建多層的文件夾,類(lèi)似 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ù)器上面有沒(méi)有 upload 目錄。如果沒(méi)有就創(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í)例我們通過(guò)讀取一個(gè)文件內(nèi)容并將內(nèi)容寫(xiě)入到另外一個(gè)文件中。
const fs = require("fs") //創(chuàng)建一個(gè)可讀流 const readerStream = fs.createReadStream('input.txt') //創(chuàng)建一個(gè)可寫(xiě)流 const writerStream = fs.createWriteStream('output.txt') //管道讀寫(xiě)操作 //讀取input.txt文件內(nèi)容,并將內(nèi)容寫(xiě)入到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 寫(xiě)入文件 const fs = require("fs") const data ='我是從數(shù)據(jù)庫(kù)獲取的數(shù)據(jù),我要保存起來(lái)' //創(chuàng)建一個(gè)可以寫(xiě)入的流,寫(xiě)入到文件output.txt中 const writerStream = fs.createWriteStream('output.txt') //使用utf8編碼寫(xiě)入數(shù)據(jù) writerStream.write(data,'UTF8') //標(biāo)記文件末尾 writerStream.end() //處理流事件-->finish事件 writerStream.on('finish', () => { /*finish-所有數(shù)據(jù)已被寫(xiě)入到底層系統(tǒng)時(shí)觸發(fā)。*/ console.log("寫(xiě)入完成。") }) 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 要寫(xiě)入的目錄一定要帶上要復(fù)制的文件名,也就是不能寫(xiě)成 fs.createWriteStream('./wwwroot/images/') 否則在 macOS 下會(huì)報(bào)如下錯(cuò)誤:
Error: EISDIR: illegal operation on a directory, open
看完上述內(nèi)容,你們掌握如何在Node.js中使用文件系統(tǒng)fs模塊的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!