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 = 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 实现文件拷贝的更多相关文章
- nodejs 文件拷贝
小文件拷贝 我们使用NodeJS内置的fs模块简单实现这个程序如下. var fs = require('fs'); function copy(src, dst) { fs.writeFileSyn ...
- nodejs pipe实现大文件拷贝
原文: http://nqdeng.github.io/7-days-nodejs/ --------------------------------------------------------- ...
- node实现文件拷贝2
https://www.cnblogs.com/coding4/p/7495968.html 文件拷贝NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件 ...
- node实现文件拷贝1
nodeJS对文件的复制: 一般对于小型文件的复制操作使用的是流的管道运输操作, 首先需要加载引入的文件:var fs = require('fs'); 1.同步创建文件夹 fs.mkdirSync( ...
- Linux系统下远程文件拷贝scp命令
在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...
- PC windows mobile 文件拷贝
在windows 系统中提供 RAPI.DLL,只需将RAPI.DLL中的,函数导出就可以实现文件拷贝.
- Java学习-045-目录中文件拷贝
挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...
- Dos命令完成文件拷贝
Dos命令初阶--文件拷贝 1.XCOPY命令 可以在cmd中录入:XCOPY /? 即可查看帮助 帮助: XCOPY Microsoft Windows [版本 6.2.9200] (c) 2012 ...
- linux或者windows下的文件拷贝
# 上代码 #!/usr/bin/env python # -*- coding:utf-8 -*- import os import shutil import tarfile base_dir ...
随机推荐
- 去重和分类后缀asp、php等路径 用python3写的
我们在做渗透的时候肯定会用上扫描器的,本人一般会用御剑,当然你也会喜欢别的工具. 很多时候,能否渗透成功其实还挺依赖与字典的,如果把后台给扫出来了,恰好还弱口令,那么岂不是美滋滋. 因此,有一个好的字 ...
- HTML5中的语义标签兼容IE8以及更低版本的浏览器
看某教程,说让HTML5的这些语义标签能够兼容低版本的浏览器,原文是“你可以设置css的display属性为block”.很好理解,就设置css样式为block嘛,那就直接设置咯: header, s ...
- update_engine-FilesystemVerifierAction和PostinstallRunnerAction
在介绍完了DownloadAction之后,还剩下FilesystemVerifierAction和PostinstallRunnerAction,下面开始对其进行分析. FilesystemVeri ...
- TCL 引用同目录下其他脚本文件--source
方法一: source [file join [file dirname [info script]] Export_inp_by_loadstep.tcl] 方法二: source [file jo ...
- RN 使用第三方字体
Android: 程序会尝试在 assets/fonts 目录下查找字体文件,如果没找到会使用默认的字体 所以将文件放到路径下才能生效! [project root]/android/app/src/ ...
- 找到排序矩阵中从小到大第K个数字
一 题目描述 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的定义为:每一行递增,每一列也递增. 二 题解 由于排序矩阵中的每一行都是递增的,并且每一列都是递增的.从小到大第k个数,实际上就是 ...
- ssl握手数据结构
ssl握手 SSL记录头(5字节) 字节0:记录内容的类型 Content Type Hex Code Description Change_Cipher_Spec 0x14 指示加密方式的更改 Al ...
- 转 Ubuntu16.04+QT4.8.7开发环境搭建
Qt安装步骤1.安装g++以及依赖库 sudo apt-get install g++ sudo apt-get install g++-multilib libx11-dev libxext-de ...
- Kong(V1.0.2)loadbalancing
介绍 Kong为多个后端服务提供了多种负载平衡请求的方法:一种简单的基于DNS-based的方法,以及一种更动态的环形负载均衡器ring-balancer,它还允许在不需要DNS服务器的情况下使用se ...
- Python【每日一问】13
问:请简述一下python的GIL 答:GIL 锁,全局解释器锁,仅在CPython解释器中,作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行.