node 复制文件的五种方式

简介: node 复制文件的五种方式
const fs = require("fs");
const path = require("path");
// 方法1 直接使用原生的来
(async () => {
    console.time('方式1')
    const fileName = path.resolve(__dirname, './fsModule/复制文件1.docx');
    const fileCont = await fs.promises.readFile(path.resolve(__dirname, './fsModule/100MB大文件.docx'), 'utf-8');
    await fs.promises.writeFile(fileName, fileCont, {encoding: 'utf-8', flag: 'w'});
    console.timeEnd('方式1') //方式1: 1318.309ms
})()
// 方法2 通过流的方法来读取
(() => {
    console.time('用流的方式读取文件')
    const fromFileName = path.resolve(__dirname, './fsModule/100MB大文件.docx');
    const toFileName = path.resolve(__dirname, './fsModule/复制文件2.docx');
    const rs = fs.createReadStream(fromFileName, {
        autoClose: true,
        encoding: 'utf-8',
        highWaterMark: 64 * 1024 * 1024,
        flags: 'r'
    })
    const ws = fs.createWriteStream(toFileName, {
        encoding: 'utf-8',
        flags: 'a',
        highWaterMark: 16 * 1024 * 1024,
        autoClose: true
    })
    rs.on('data', chunk => {
        ws.write(chunk, 'utf-8');
    })
    rs.on('end', () => {
        console.log('文件写入完毕!!')
    })
    console.timeEnd('用流的方式读取文件') //用流的方式读取文件: 4.218ms
})()
// 方式3 优化用流读取 解决背压问题
(() => {
    console.time('优化用流的方式读取文件')
    const fromFileName = path.resolve(__dirname, './fsModule/100MB大文件.docx');
    const toFileName = path.resolve(__dirname, './fsModule/复制文件3.docx');
    const rs = fs.createReadStream(fromFileName, {
        autoClose: true,
        encoding: 'utf-8',
        highWaterMark: 64 * 1024 * 1024,
        flags: 'r'
    })
    const ws = fs.createWriteStream(toFileName, {
        encoding: 'utf-8',
        flags: 'a',
        highWaterMark: 16 * 1024 * 1024,
        autoClose: true
    })
    rs.on('data', chunk => {
        const wsFlag = ws.write(chunk, 'utf-8');
        if (!wsFlag) {
            rs.pause();
        }
    })
    ws.on('drain', () => {
        // 继续读取
        rs.resume();
    })
    rs.on('end', () => {
        console.log('文件写入完毕!!')
        ws.end();
    })
    console.timeEnd('优化用流的方式读取文件') //用流的方式读取文件:  3.006ms
})()
// 方法四: pipe
(() => {
    console.time('优化用流的方式读取文件')
    const fromFileName = path.resolve(__dirname, './fsModule/100MB大文件.docx');
    const toFileName = path.resolve(__dirname, './fsModule/复制文件4.docx');
    const rs = fs.createReadStream(fromFileName, {
        autoClose: true,
        encoding: 'utf-8',
        highWaterMark: 64 * 1024 * 1024,
        flags: 'r'
    })
    const ws = fs.createWriteStream(toFileName, {
        encoding: 'utf-8',
        flags: 'a',
        highWaterMark: 16 * 1024 * 1024,
        autoClose: true
    })
    // 直接解决背压问题
    rs.pipe(ws);
    console.timeEnd('优化用流的方式读取文件') // 7.967ms
})()
// 方法五 copyFile 
const fromFileName = path.resolve(__dirname, './fsModule/100MB大文件.docx');
const toFileName = path.resolve(__dirname, './fsModule/复制文件5.docx');
fs.copyFile(fromFileName, toFileName,0, ()=>{
    console.log('复制完成')
})
相关文章
|
8月前
|
Web App开发 JavaScript 前端开发
【Node系列】文件系统介绍及案例说明
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以用于构建高性能的网络应用程序。它采用事件驱动、非阻塞I/O模型,使得程序可以以高效地方式处理并发请求。
73 4
|
8月前
Node 删除目录
Node 删除目录
54 0
node判断文件夹是否存在,不存在直接创建
node判断文件夹是否存在,不存在直接创建
|
8月前
|
JSON 关系型数据库 MySQL
node笔记_读取目录的文件
node笔记_读取目录的文件
56 1
|
8月前
|
前端开发
./ 相对路径与node程序的启动目录有关
./ 相对路径与node程序的启动目录有关
42 0
|
8月前
|
JavaScript
Node fs 创建多层文件夹
Node fs 创建多层文件夹
58 0
|
8月前
|
JavaScript
node.js 删除某个目录下所有的文件夹
node.js 删除某个目录下所有的文件夹
140 0
|
8月前
Node 创建多级目录
Node 创建多级目录
68 0
|
API
node中fs模块之文件操作
node中fs模块之文件操作
87 0