Nodejs文件覆盖、追加、读取、全量复制(同步版本)

 如需要异步版本,则参考:https://blog.csdn.net/nickDaDa/article/details/102371073

逻辑类中包含了,文件的:更新覆盖;内容追加;读取;全部复制。

相关注意事项参考:https://blog.csdn.net/nickDaDa/article/details/102371073

逻辑处理类的实现:syncdata.js

const fs = require("fs");

/**
 * update file
 * @param   res  to update content
 * @returns update operation result
 */
async function updateResFile (res) {
    return new Promise((resolve, reject) => {
        fs.writeFile(`${conf['workdir']}${conf['res']}`, res, (err) => {
            if (err) {
                console.error(`error happened when updateResFile inner: ${err.message}`);
                reject(false);
                return;
            } else {
                resolve(true);
                return;
            }
          });
    }).catch(error => {
        console.error(`error happened when updateResFile: ${error.message}`);
        return false;
    });
}

/**
 * break line append log
 * @param log log content
 * @returns append operation result
 */
async function appendFile (log) {
    return new Promise((resolve, reject) => {
        if ("windows" == conf['os']) {
            log+='\r\n';
        } else {
            log+='\n';
        }
        fs.appendFile(`${conf['workdir']}${conf['log']}`, log, (err) => {
            if (err) {
                console.error(`error happened when appendFile inner: ${err.message}`);
                reject(false);
                return;
            } else {
                resolve(true);
                return;
            }
          });
    }).catch(error => {
        console.error(`error happened when appendFile: ${error.message}`);
    });
}

/**
 * execute copy file logic
 * @param {*} src 
 * @param {*} dst 
 * @param {*} callback 
 */
async function handleDir (src, dst) {
    return new Promise(async (resolve, reject) => {
        fs.access(dst, fs.constants.F_OK, async (err) => {
            if (err) {
                fs.mkdir(dst, { recursive: true }, async (err) => {
                    if (err) {
                        console.error(`error happened when handleDir.mkdir: ${err.message}`);
                        reject(`error happened when handleDir.mkdir: ${err.message}`);
                        return;
                    } else {
                        await copyDir(src, dst);
                    }
                  });
                
            } else {
                await copyDir(src, dst);
            }
            resolve(true);
        });
    }).catch(error => {
        console.error(`error happened when handleDir: ${error.message}`);
    });
}

/**
 * execute iterator copy directory
 * @param src directory source path
 * @param dst directory destination path
 * @returns copy result
 */
async function copyDir (src, dst) {
    return new Promise(async (resolve, reject) => {
        fs.readdir(src, (err, paths) => {
            paths.forEach(function(path){
              var _src=src+'/'+path;
              var _dst=dst+'/'+path;
              fs.stat(_src, async function(err,stats){
                if(err) {
                    console.error(`copyDir failed, caused by ${JSON.stringify(err)}`);
                    reject(false);
                } else if(stats.isFile()){
                  let readable=fs.createReadStream(_src);
                  let writable=fs.createWriteStream(_dst);
                  readable.pipe(writable);
                  readable.on('end', () => {
                    resolve(true);
                  });
                }else if(stats.isDirectory()){
                  await handleDir(_src, _dst, copyDir);
                }
              });
            });
        });
    }).catch(error => {
        console.error(`error happened when copyDir: ${error.message}`);
    });
}

/**
 * read file sync
 * @param path filefullpath
 * @returns file content
 */
async function readFile (path) {
    return new Promise((resolve, reject) => {
        fs.readFile(path, conf['encode'] , (err, data) => {
            if (err) {
                console.error(`readFile failed, caused by ${JSON.stringify(err)}`);
                reject(false);
            } else {
                resolve(data);
                return;
            }
          });
    }).catch(error => {
        console.error(`error happened when readFile: ${error.message}`);
    });
}

/**
 * main entrance
 */
async function syncFile () {

    console.log(`begin ------- ${new Date().getTime()}`);
    let cpRes = await copyDir('D:/开发文档/邮件文档/1-邮件附件', './2');
    console.log(`result is ${cpRes}`);
    console.log(`end ------- ${new Date().getTime()}`);
}

// call
syncFile ();

同一目录下的配置文件conf.json

{
    "os" : "windows",
    "encode" : "utf-8",
    "workdir" : "/home/",
    "latestVersion" : "latestVersion.txt",
    "currentVersion" : "currentVersion.txt",
    "log" : "log.txt",
    "res" : "syncResult.txt",
    "copySrc" : "/copySrc/",
    "copyDst" : "/copyDst/",
    "success-text" : "success",
    "fail-text" : "fail",
    "dateformat" : "YYYY-MM-DD"
}

执行方式:

cd到syncdata.js同一级目录,执行,

node syncdata.js

经测试,复制操作可以实现时序控制,4.5G内容文件大约耗时7.7秒

结果:

C:\Users\admin\Desktop\exercise\js
$ node 1.js
begin ------- 1570508604356
result is true
end ------- 1570508612121

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值