nodejs 實現檔案拷貝
阿新 • • 發佈:2018-12-10
通過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 = 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('寫入完成'); }) }
方式四:使用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 = 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) }
方法一和方法二使用起來簡單,但是在操作大檔案時對記憶體壓力大,不推薦讀取大檔案使用
另外如果需要對檔案制定塊進行讀取和寫入請使用read 、write 兩個方法