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 = 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 实现文件拷贝相关推荐
- 你知道Java文件拷贝有几种方式么?
作者:不清不慎,目前在杭州蘑菇街公司任职,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! java中的文件拷贝主要有三种方式来实现. 一.使用输入输出流 可以使用java.io包 ...
- cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...
本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...
- java拷贝压缩文件_Android java, 快速文件拷贝,文件压缩,获得系统时间 | 学步园...
1. 最快速度的文件拷贝,管道对管道. /** * Create report file. * @param srcFile * @param dstFile */ private void Crea ...
- Java实现文件拷贝
经过一组简单的测试发现JAVA NIO提供的文件内存映射方法实现文件拷贝速度最快,不管是大文件还是小文件,特别是大文件的拷贝速度比普通方法提高20倍,唯一有个前提就是内存需要足够大,否则文件映射肯定失 ...
- 远程服务器的url怎么配置文件,Linux常用命令(5)--SSH访问远程服务器、SCP服务器间文件拷贝...
一.使用"ssh"命令,登录访问远程服务器 Linux是一个支持多用户操作的系统,在同一时刻允许多个用户同时访问系统,共享系统提供的服务.那么用户如何从不同的机器上访问同一台Lin ...
- linux大文件拷贝,Linux如何提高大文件的拷贝效率
Linux系统操作中,当你在进行机器直接的拷贝时,遇到大文件的时候非常浪费时间,特别是将文件同时拷贝到多台机器上的时候,那么有什么好的方法能够提高大文件的拷贝效率呢?一起来学习下吧. 你可以从源机器逐 ...
- linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?
今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么? 以下是我的工具方法: / ...
- java 文件 剪切_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 很多朋友在看我的<java IO总结系列>之前觉得创建文件.文件夹删除文件这些基础操作真的是太简单了.但看了我的文章之后,有小 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
最新文章
- Android配置----Android开发环境搭建
- 使用 Composer 安装 Laravel 框架
- (原创).Net将EF运用于Oralce一 准备工作
- atitit。wondows 右键菜单的管理与位置存储
- 转载:CEO如何“养好CIO同时管好CIO”?
- .Net的后台服务技术有哪些?
- 【英语学习】【Level 07】U03 Amazing wonders L6 My homeland, my pride
- 亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争
- html img 自动缩放,网页HTML 5图片自适应屏幕 img等比例缩放大小代码
- ZooKeeper实际应用案例-开发实战
- 小米电视看电脑共享文件服务器,小米电视怎么共享电脑看本地视频【图文】
- linux网卡驱动重新安装,LINUX网卡驱动重新安装
- 更改文件夹目录、硬盘、U盘的图标
- 创建vue3项目(vite+js)
- 2022-2028年中国网络安全行业市场专项调研及投资前景规划报告
- redis下载安装后电脑任务管理器中没有redis的显示
- 2.给 Proxmox VE换源
- 为什么图像成像时近大远小?
- Dobot magician + realsense D435i 手眼标定(外参)
- 微信小程序滚动播放内容
热门文章
- a1708硬盘转接口_资讯:希捷上架新款银河Exos系列机械硬盘,15000转+SAS协议
- Hibernate 更新部分更改的字段 hibernate update
- leetcode85. 最大矩形
- setsockopt()用法(参数详细说明)
- Python(2)-第一个python程序、执行python程序三种方式
- 属性加密技术及基于属性的ABE算法的访问控制技术介绍
- IPFS下载安装和配置
- SpringBoot默认的错误处理机制
- codeforces 118A-C语言解题报告
- Android Glide图片加载框架(一)基本用法