博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs 实现文件拷贝
阅读量:6720 次
发布时间:2019-06-25

本文共 2701 字,大约阅读时间需要 9 分钟。

通过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 两个方法

转载于:https://www.cnblogs.com/xiaoliwang/p/10095623.html

你可能感兴趣的文章
我在印尼工作的日子-初来乍到
查看>>
Linux/安卓+SPI以太网项目
查看>>
PostgreSQL MySQL 的一次速度测试
查看>>
C 语言程序设计
查看>>
Dns信息收集工具集合
查看>>
MQ产品比较-ActiveMQ-RocketMQ
查看>>
yii框架cridview的ajax更新
查看>>
STL容器选择
查看>>
android:layout_gravity 和 android:gravity 的区别
查看>>
嵌入式C题
查看>>
maven学习笔记
查看>>
说说Java线程池
查看>>
Linux挂载命令mount用法及参数详解
查看>>
Nginx 动静分离
查看>>
MySQL如何实现数组功能
查看>>
Android第四十七期 - WheelView沉浸式菜单栏
查看>>
Spring Boot--模板从JSP到Freemarker的若干问题
查看>>
Java内存模型的探究
查看>>
CentOS6.5 从源码编译安装 GCC-4.9.1 全程实录《第二部分:编译,安装,测试》
查看>>
反查bash历史记录--用Enki学Linux系列(16)
查看>>