1. 程式人生 > >nodejs 實現檔案拷貝

nodejs 實現檔案拷貝

通過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 兩個方法