node 完成文件复制探索

一、最一般的方法:

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("文件复制完成")
})

此时将自动协调工作的同步,及关闭流的问题。

你可能感兴趣的:(node 完成文件复制探索)