通过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 = 0var totalSize = 0const stat = fs.stat(url, (err , stats) => {totalSize = stats.size})readable.on('open', () => {console.log('打开文件');})readable.on('data', data => {size = data.length + sizeconsole.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 = 0var totalSize = 0const 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

nodejs 实现文件拷贝相关推荐

  1. 你知道Java文件拷贝有几种方式么?

    作者:不清不慎,目前在杭州蘑菇街公司任职,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! java中的文件拷贝主要有三种方式来实现. 一.使用输入输出流 可以使用java.io包 ...

  2. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  3. java拷贝压缩文件_Android java, 快速文件拷贝,文件压缩,获得系统时间 | 学步园...

    1. 最快速度的文件拷贝,管道对管道. /** * Create report file. * @param srcFile * @param dstFile */ private void Crea ...

  4. Java实现文件拷贝

    经过一组简单的测试发现JAVA NIO提供的文件内存映射方法实现文件拷贝速度最快,不管是大文件还是小文件,特别是大文件的拷贝速度比普通方法提高20倍,唯一有个前提就是内存需要足够大,否则文件映射肯定失 ...

  5. 远程服务器的url怎么配置文件,Linux常用命令(5)--SSH访问远程服务器、SCP服务器间文件拷贝...

    一.使用"ssh"命令,登录访问远程服务器 Linux是一个支持多用户操作的系统,在同一时刻允许多个用户同时访问系统,共享系统提供的服务.那么用户如何从不同的机器上访问同一台Lin ...

  6. linux大文件拷贝,Linux如何提高大文件的拷贝效率

    Linux系统操作中,当你在进行机器直接的拷贝时,遇到大文件的时候非常浪费时间,特别是将文件同时拷贝到多台机器上的时候,那么有什么好的方法能够提高大文件的拷贝效率呢?一起来学习下吧. 你可以从源机器逐 ...

  7. linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?

    今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么? 以下是我的工具方法: / ...

  8. java 文件 剪切_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 很多朋友在看我的<java IO总结系列>之前觉得创建文件.文件夹删除文件这些基础操作真的是太简单了.但看了我的文章之后,有小 ...

  9. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...

最新文章

  1. Android配置----Android开发环境搭建
  2. 使用 Composer 安装 Laravel 框架
  3. (原创).Net将EF运用于Oralce一 准备工作
  4. atitit。wondows 右键菜单的管理与位置存储
  5. 转载:CEO如何“养好CIO同时管好CIO”?
  6. .Net的后台服务技术有哪些?
  7. 【英语学习】【Level 07】U03 Amazing wonders L6 My homeland, my pride
  8. 亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争
  9. html img 自动缩放,网页HTML 5图片自适应屏幕 img等比例缩放大小代码
  10. ZooKeeper实际应用案例-开发实战
  11. 小米电视看电脑共享文件服务器,小米电视怎么共享电脑看本地视频【图文】
  12. linux网卡驱动重新安装,LINUX网卡驱动重新安装
  13. 更改文件夹目录、硬盘、U盘的图标
  14. 创建vue3项目(vite+js)
  15. 2022-2028年中国网络安全行业市场专项调研及投资前景规划报告
  16. redis下载安装后电脑任务管理器中没有redis的显示
  17. 2.给 Proxmox VE换源
  18. 为什么图像成像时近大远小?
  19. Dobot magician + realsense D435i 手眼标定(外参)
  20. 微信小程序滚动播放内容

热门文章

  1. a1708硬盘转接口_资讯:希捷上架新款银河Exos系列机械硬盘,15000转+SAS协议
  2. Hibernate 更新部分更改的字段 hibernate update
  3. leetcode85. 最大矩形
  4. setsockopt()用法(参数详细说明)
  5. Python(2)-第一个python程序、执行python程序三种方式
  6. 属性加密技术及基于属性的ABE算法的访问控制技术介绍
  7. IPFS下载安装和配置
  8. SpringBoot默认的错误处理机制
  9. codeforces 118A-C语言解题报告
  10. Android Glide图片加载框架(一)基本用法