如需要异步版本,则参考: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