工作中難免會遇到處理大文件的時候,有這種stream的處理方式,就不需要一次處理太大的文件,從而導致內存不夠用,或者內存占用太多。
fs.createWriteStream 似乎不會自己創建不存在的文件夾,所以在使用之前需要注意,保存文件的文件夾一定要提前創建。
const path = '/xxxxxx/ddd/';if (!fs.existsSync(path)) { fs.mkdirSync(path);}創建完文件夾,我們就可以進行文件添加操作了。我們希望在使用文件添加操作的時候是通過saveFile(filePath, fileData);這樣的方式來調用。
這里我采用了Promise的方式,個人比較喜歡這樣的方式
/** * [saveFileWithStream description] * @param {String} filePath [文件路徑] * @param {Buffer} readData [Buffer 數據] */ 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); }); }); }實際調用的時候,如下
try { await saveFileWithStream(filePath, fileData); // 這里的fileData是Buffer類型} catch (err) { console.log(err.stack);}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答