nodejs 實現文件拷貝

經過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 兩個方法事件

相關文章
相關標籤/搜索