經過4中不通的方式實現對一個文件的拷貝異步
方式一:readFile 異步一次性讀取文件再寫入ui
//異步形式讀取文件 function copyFile(url){ const extName = path.extname(url) const fileName = path.basename(url) const dirName = path.dirname(url) fs.readFile(url, (err, data) => { fs.writeFile(`${dirName}/${fileName}_copy_1${extName}`, data , err => { if(err){ console.log(`寫入出現錯誤 ${err.toString()}`) }else{ console.log('完成!') } }) }) }
方式二:readFileSync 同步一次性讀取文件再寫入url
//同步形式讀取文件 function copySync(url){ const extName = path.extname(url) const fileName = path.basename(url) const dirName = path.dirname(url) var data = fs.readFileSync(url) fs.writeFileSync(`${dirName}/${fileName}_copy_1${extName}`,data) console.log('同步拷貝完成!') }
方式三:使用流邊讀邊寫spa
const fs = require('fs') const path = require('path') // 使用流拷貝 function streamCopyFile(url){ const extName = path.extname(url) const fileName = path.basename(url) const dirName = path.dirname(url) let options = { highWaterMark : 64 * 1024 //默認值,每一個chunk的大小 } const readable = fs.createReadStream(url, options) const writable = fs.createWriteStream(`${dirName}/${fileName}_copy${extName}`) var size = 0 var totalSize = 0 const stat = fs.stat(url, (err , stats) => { totalSize = stats.size }) readable.on('open', () => { console.log('打開文件'); }) readable.on('data', data => { size = data.length + size console.log('已完成 ' + parseInt((size / totalSize) * 100) + '%'); writable.write(data) readable.pause() }) readable.on('end', () => { console.log('讀取完成') }) readable.on('error', err => { console.log(`讀取時出現錯誤 ${err.toString()}`) }) writable.on('error', err => { console.log(`寫入時出現錯誤 ${err.toString()}`) }) //將內存中數據所有寫入文件後觸發 drain 事件 writable.on('drain', () => { readable.resume() }) writable.on('finish', () => { console.error('寫入完成'); }) }
方式四:使用pipecode
//經過管道的方式 function pipeCopyFile(url){ const extName = path.extname(url) const fileName = path.basename(url) const dirName = path.dirname(url) const readable = fs.createReadStream(url) const writable = fs.createWriteStream(`${dirName}/${fileName}_copy_2${extName}`) var size = 0 var totalSize = 0 const stat = fs.stat(url, (err , stats) => { totalSize = stats.size }) writable.on('pipe', (src) => { console.log('有數據正經過管道流入寫入器') }) writable.on('finish', () => { console.error('寫入已完成') }) readable.pipe(writable) }
方法一和方法二使用起來簡單,可是在操做大文件時對內存壓力大,不推薦讀取大文件使用blog
另外若是須要對文件制定塊進行讀取和寫入請使用read 、write 兩個方法事件