一、最一般的方法:
const fs = require('fs');
// 默认情况下将创建或覆盖目标文件。
fs.copyFile('源文件.txt', '目标文件.txt', (err) => {
if (err) throw err;
console.log('源文件已拷贝到目标文件');
});
二、开子进程复制
const fs = require('fs');
const childProcess=require('child_process')
//子进程+回调
childProcess.exec('cp abc.txt abc8.txt',(err)=>{
if(!err) console.log("复制成功")
})
//子进程+ChildProcess
let cp=childProcess.spawn('cp',['abc.txt','abc8.txt'])
cp.stderr.on('data',function (err) {
console.log("文件复制失败",err.toString())
})
cp.on('close',function (code) {
if(code==0) console.log("文件复制成功!")
})
三、使用Buffer的方式
const fs=require('fs')
fs.readFile("abc.txt",function (err,chunk) {
if(!err) fs.writeFile('abc1.txt',chunk,function (err) {
if(!err) console.log("文件复制完成")
})
})
四、使用输入输出流的方式
const fs=require('fs')
let inputStream=fs.createReadStream('abc.txt');
let outStream=fs.createWriteStream('abc2.txt');
inputStream.on('data',function (chunk) {
outStream.write(chunk)
})
inputStream.on('end',function () {
inputStream.close()
outStream.close()
console.log("文件复制完成 ")
})
此方法比较问题在于,没有考虑到back-pressure
五、解决背压问题的改良方法:
const fs=require('fs')
let inputStream=fs.createReadStream('abc.txt');
let outStream=fs.createWriteStream('abc2.txt');
//输出流的缓存被放光时,恢复输入流的读取工作
outStream.on('drain',function () {
inputStream.resume();
})
inputStream.on('data',function (chunk) {
//写入缓存数据,并嗅探是否以有继续写入
let ok=outStream.write(chunk);
if(!ok) inputStream.pause();//如果不可以,暂停输入流的工作
})
inputStream.on('end',function () {
inputStream.close()
outStream.close()
console.log("文件复制完成")
})
六、“五”的语法糖形式
const fs=require('fs')
let inputStream=fs.createReadStream('abc.txt');
let outStream=fs.createWriteStream('abc2.txt');
inputStream.pipe(outStream)
inputStream.on('end',function () {
console.log("文件复制完成")
})
此时将自动协调工作的同步,及关闭流的问题。
网友评论