通過4中不通的方式實現對一個文件的拷貝
方式一:readFile 異步一次性讀取文件再寫入
//異步形式讀取文件 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 同步一次性讀取文件再寫入
//同步形式讀取文件 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('同步拷貝完成!') }
方式三:使用流邊讀邊寫
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 = 0var totalSize = 0const stat = fs.stat(url, (err , stats) => {totalSize = stats.size})readable.on('open', () => {console.log('打開文件');})readable.on('data', data => {size = data.length + sizeconsole.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('寫入完成');}) }
方式四:使用pipe
//通過管道的方式 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 = 0var totalSize = 0const stat = fs.stat(url, (err , stats) => {totalSize = stats.size})writable.on('pipe', (src) => {console.log('有數據正通過管道流入寫入器')})writable.on('finish', () => {console.error('寫入已完成')})readable.pipe(writable) }
方法一和方法二使用起來簡單,但是在操作大文件時對內存壓力大,不推薦讀取大文件使用
另外如果需要對文件制定塊進行讀取和寫入請使用read 、write 兩個方法