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

最新文章

  1. [LeetCode] Search for a Range 搜索一个范围
  2. 【git常见问题】fatal: Not a valid object name: 'master'.
  3. Zend studio 10.6 配置XDEBUG
  4. windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩展(转)
  5. STL容器set()--->自定义数据类型
  6. struts2 表单处理
  7. java jdbc 连接mysql 数据库
  8. iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏
  9. angular4.0项目main.ts详解
  10. [bzoj3282]Tree (lct)
  11. 团队作业5-测试与发布(AIpha版本)
  12. 关于ES6的module的循环加载
  13. Android logcat lines missing原因分析
  14. 【安全性测试】一个简单地绕前端暴XSS漏洞
  15. c# chart控件柱状图,改变柱子宽度
  16. 虚拟机CentOS7下NAT模式的网络配置
  17. python与用户交互、数据类型
  18. 用Python优雅的处理日志
  19. HTTP 协议入门-笔记
  20. mysql主从备份功能配置与測试

热门文章

  1. 20164301 Exp5 MSF基础应用
  2. Go 包管理工具--glide
  3. day02 python数据类型
  4. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(388,5): warning MSB8028: The intermediate directory (Debug) contains files shared from another project (GU.vcxproj). T
  5. Dev GridControl数据修改后实时更新数据源(转)
  6. py-day4-1 python reduce函数
  7. Cobbler全自动批量安装部署Linux系统
  8. Unity3D外包 团队更新一下UE4和Unity3D案例
  9. 记录一次MyEclipse打开jsp文件出现Error的解决办法
  10. sqlhelper类,C#事务入库