工作中難免會(huì)遇到處理大文件的時(shí)候,有這種stream的處理方式,就不需要一次處理太大的文件,從而導(dǎo)致內(nèi)存不夠用,或者內(nèi)存占用太多。
10余年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站制作,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁制作,對(duì)電動(dòng)窗簾等多個(gè)行業(yè),擁有多年的網(wǎng)站營銷經(jīng)驗(yàn)。
fs.createWriteStream 似乎不會(huì)自己創(chuàng)建不存在的文件夾,所以在使用之前需要注意,保存文件的文件夾一定要提前創(chuàng)建。
const path = '/xxxxxx/ddd/'; if (!fs.existsSync(path)) { fs.mkdirSync(path); }
創(chuàng)建完文件夾,我們就可以進(jìn)行文件添加操作了。我們希望在使用文件添加操作的時(shí)候是通過saveFile(filePath, fileData);這樣的方式來調(diào)用。
這里我采用了Promise的方式,個(gè)人比較喜歡這樣的方式
/** * [saveFileWithStream description] * @param {String} filePath [文件路徑] * @param {Buffer} readData [Buffer 數(shù)據(jù)] */ static saveFile(filePath, fileData) { return new Promise((resolve, reject) => { // 塊方式寫入文件 const wstream = fs.createWriteStream(filePath); wstream.on('open', () => { const blockSize = 128; const nbBlocks = Math.ceil(fileData.length / (blockSize)); for (let i = 0; i < nbBlocks; i += 1) { const currentBlock = fileData.slice( blockSize * i, Math.min(blockSize * (i + 1), fileData.length), ); wstream.write(currentBlock); } wstream.end(); }); wstream.on('error', (err) => { reject(err); }); wstream.on('finish', () => { resolve(true); }); }); }
實(shí)際調(diào)用的時(shí)候,如下
try { await saveFileWithStream(filePath, fileData); // 這里的fileData是Buffer類型 } catch (err) { console.log(err.stack); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。