zoukankan      html  css  js  c++  java
  • 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 两个方法

  • 相关阅读:
    绝对路径和相对路径
    基本的文件操作
    Python2和3字符编码区别
    java开发两年了,连个java代理模式都摸不透,你怎么跳槽涨薪?
    【建议收藏】阿里P7总结的Spring注解笔记,把组件注册讲的明明白白
    面试官:你说你精通SpringBoot,你给我说一下类的自动装配吧
    面试BAT问的最多的27道MyBatis 面试题(含答案和思维导图总结)
    Springboot 框架整理,建议做开发的都看看,整理的比较详细!
    直面秋招!非科班生背水一战,最终拿下阿里等大厂offer!
    写的太细了!Spring MVC拦截器的应用,建议收藏再看!
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/10095623.html
Copyright © 2011-2022 走看看