nodejs 实现文件拷贝
2024-09-09 09:50:26
通过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 两个方法
最新文章
- [LeetCode] Search for a Range 搜索一个范围
- 【git常见问题】fatal: Not a valid object name: 'master'.
- Zend studio 10.6 配置XDEBUG
- windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩展(转)
- STL容器set()--->;自定义数据类型
- struts2 表单处理
- java jdbc 连接mysql 数据库
- iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏
- angular4.0项目main.ts详解
- [bzoj3282]Tree (lct)
- 团队作业5-测试与发布(AIpha版本)
- 关于ES6的module的循环加载
- Android logcat lines missing原因分析
- 【安全性测试】一个简单地绕前端暴XSS漏洞
- c# chart控件柱状图,改变柱子宽度
- 虚拟机CentOS7下NAT模式的网络配置
- python与用户交互、数据类型
- 用Python优雅的处理日志
- HTTP 协议入门-笔记
- mysql主从备份功能配置与測试
热门文章
- 20164301 Exp5 MSF基础应用
- Go 包管理工具--glide
- day02 python数据类型
- 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
- Dev GridControl数据修改后实时更新数据源(转)
- py-day4-1 python reduce函数
- Cobbler全自动批量安装部署Linux系统
- Unity3D外包 团队更新一下UE4和Unity3D案例
- 记录一次MyEclipse打开jsp文件出现Error的解决办法
- sqlhelper类,C#事务入库