逻辑类中包含了,文件的:更新覆盖;内容追加;读取;全部复制。
所有方法都是异步的,如果需要同步则需要修改fs的方法,并使用Promise进行包装,另外需要注意,全部复制的方法需要传入两个目录,不带文件的path,并且是有最大文件打开数量限制的,如果是大文件但文件数量较少则适合使用,如果是小文件且数量大,则不适合,建议进行先打成压缩包,再进行传输。
如果需要同步版本,可以参考:https://blog.csdn.net/nickDaDa/article/details/102375966
逻辑处理类的实现:syncdata.js
const fs = require("fs");
// local path
const conf = require("./conf.json");
/**
* update file
* @param res to update content
* @returns update operation result
*/
function updateResFile (res) {
return fs.writeFileSync(`${conf['workdir']}${conf['res']}`, res);
}
/**
* break line append log
* @param log log content
* @returns append operation result
*/
function appendFile (log) {
if ("windows" == conf['os']) {
log+='\r\n';
} else {
log+='\n';
}
return fs.appendFileSync(`${conf['workdir']}${conf['log']}`, log);
}
/**
* handle directory
* @param {*} src
* @param {*} dst
* @param {*} callback
*/
function handleDir(src, dst) {
fs.access(dst, fs.constants.F_OK, (err) => {
if (err) {
fs.mkdirSync(dst);
copyDir(src, dst);
} else {
copyDir(src, dst);
}
});
}
/**
* execute iterator copy directory
* @param src directory source path
* @param dst directory destination path
* @returns copy result
*/
function copyDir (src, dst) {
// read file path sync
let paths = fs.readdirSync(src);
paths.forEach(function(path){
var _src=src+'/'+path;
var _dst=dst+'/'+path;
//stats object, include its own attribute
fs.stat(_src,function(err,stats){
if(err) {
console.log(`copyDir failed, caused by ${JSON.stringify(err)}`);
return false;
} else if(stats.isFile()){
let readable=fs.createReadStream(_src);
let writable=fs.createWriteStream(_dst);
readable.pipe(writable);
}else if(stats.isDirectory()){
handleDir(_src, _dst, copyDir);
}
});
});
return true;
}
/**
* read file sync
* @param path filefullpath
* @returns file content
*/
function readFile (path) {
return fs.readFileSync(path, conf['encode']);
}
/**
* main entrance
*/
function syncFile () {
// test code here
}
// 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