通过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. MySQL命令行登陆,远程登陆MySQL 的方法

    https://www.cnblogs.com/lvk618/p/3522321.html 1.MySQL自带工具的存放路径: D:\Program Files\MySQL\MySQL Server ...

  2. python 集成cython && push 测试pip 仓库

    昨天创建了一个简单的python 集成cython 的项目 master 但是有几个问题 目前的构建时基于make 同时需要本地执行,为了方便基于pip 的安装,做了如下调整 项目准备 项目使用ven ...

  3. Golang之接口

  4. Lunar Lander 月球冒险

    发售年份 1979 平台 街机 开发商 雅达利(Atari) 类型 飞行模拟 https://www.youtube.com/watch?v=McAhSoAEbhM

  5. 第6章 Hyperledger Fabric模型

    This section outlines the key design features woven into Hyperledger Fabric that fulfill its promise ...

  6. DNS缓存服务器与转发服务器

    DNS缓存服务器与转发服务器 什么是缓存服务器(cache-only) 缓存服务器只需要根区域解析库文件,不包含任何其它区域解析库文件,这样的服务器就叫着缓存服务器.这样的服务器只有缓存搜寻结果的功能 ...

  7. FPGA调试技巧

    FPGA调试技巧 八月,一直在debug, 编译,查信号,几乎没机会,也没心思停留下来看点东西,静心思考,做点笔记.今天,在硬盘上翻到了保存已久,但一直没想起来读的一本手册.这是我初入职场,决定从硬件 ...

  8. [转]自建Syncthing中继服务器(私密传输或造福大众)

    自建Syncthing中继服务器(私密传输或造福大众) 一.介绍 我之前介绍了Syncthing,作为一款开源的文件同步程序,它的功能还是非常强大的,我也很高兴能看到它被越来越多的人知道和使用,前几天 ...

  9. abaqus 帮助文档 Substructure(子结构) 理论

    对于静态问题,可以缩减到只保留Retain Node的刚度矩阵和载荷矩阵: 但对于动力问题,还需要增加内部节点作为retain node,但这样会有点麻烦,更为常用的方式是保留子结构的模态和振型.

  10. Internet Explorer 安全区域注册表项说明

    引用网址:http://support.microsoft.com/kb/182569/zh-cnInternet Explorer 安全区域设置存储在以下注册表子项下面: HKEY_LOCAL_MA ...