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

nodejs 实现文件拷贝的更多相关文章

  1. nodejs 文件拷贝

    小文件拷贝 我们使用NodeJS内置的fs模块简单实现这个程序如下. var fs = require('fs'); function copy(src, dst) { fs.writeFileSyn ...

  2. nodejs pipe实现大文件拷贝

    原文: http://nqdeng.github.io/7-days-nodejs/ --------------------------------------------------------- ...

  3. node实现文件拷贝2

    https://www.cnblogs.com/coding4/p/7495968.html 文件拷贝NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件 ...

  4. node实现文件拷贝1

    nodeJS对文件的复制: 一般对于小型文件的复制操作使用的是流的管道运输操作, 首先需要加载引入的文件:var fs = require('fs'); 1.同步创建文件夹 fs.mkdirSync( ...

  5. Linux系统下远程文件拷贝scp命令

    在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...

  6. PC windows mobile 文件拷贝

    在windows 系统中提供 RAPI.DLL,只需将RAPI.DLL中的,函数导出就可以实现文件拷贝.

  7. Java学习-045-目录中文件拷贝

    挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...

  8. Dos命令完成文件拷贝

    Dos命令初阶--文件拷贝 1.XCOPY命令 可以在cmd中录入:XCOPY /? 即可查看帮助 帮助: XCOPY Microsoft Windows [版本 6.2.9200] (c) 2012 ...

  9. linux或者windows下的文件拷贝

    #  上代码 #!/usr/bin/env python # -*- coding:utf-8 -*- import os import shutil import tarfile base_dir ...

随机推荐

  1. [C]最大公约数和最小公倍数

    /*求最大公约数和最小公倍数 编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果. */ #in ...

  2. Tempset 暴风射击

    发售年份 1980 平台 街机 开发商 雅达利(Atari) 类型 射击 https://www.youtube.com/watch?v=AMto2HJJSSA

  3. Zabbix server的配置文件没有真正生效

    现状 Zabbix server端迁移之后,一直卡,卡的不行的卡,一直以为是网络的原因,实在忍受不下去了,还是得排查排查   在界面上一直显示这条,但是我的zabbix_server确实是启动的,但是 ...

  4. myql 格式化日期

    date_format(a.balance_date,'%Y-%m')= date_format(#{balanceDate},'%Y-%m')

  5. NFC 大电池 高性价比手机

    NFC 大电池 高性价比手机三星 Galaxy A60元气版 黑瞳全视屏 3200万超广角拍照手机 骁龙675 6GB+64GB 丹宁黑 全网通4G 双卡双待 1499 https://item.jd ...

  6. Java...点点点语法

    https://blog.csdn.net/IT_faquir/article/details/49131173

  7. Centos6.9部署Gitlab-11.9.8并汉化

    Git 是一种分布式的代码版本管理系统,git在工作时可以不用时刻依赖后台服务器,在本地电脑上就可以管理版本控制,但是在需要协同开发时就必须要使用后台服务器了,目前互联网上有github,码云这样的远 ...

  8. ubuntu中连接mssql数据库sqlserver

    参考文章 https://blog.csdn.net/fangaoxin/article/details/5386149 (感谢作者) sudo apt-get install tdsodbc sud ...

  9. react连连看

      // Math.floor(t * Math.random()); var isInclude = function (array, element) { let alen = array.len ...

  10. qt5程序打包含qml

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行. 因此 Qt 官方开发环境里自带了一 ...