用于处理数据:对比两个不同文件夹中相同名称的json文件,然后拿到其中的json进行需要的操作,然后写入到新的文件夹中。其中会用到的知识点:
1、同步读取文件
2、同步写入文件
3、读取某个文件夹下的文件名
4、async await 将promise方法变为同步
// 引入fs
var fs = require("fs");
var path = require("path");
// 定义文件夹的名称
var OLD_DIR = 'old-ght';
var NEW_DIR = 'new-ght';
var OUTPUT_DIR = 'node-output';
// 旧版本文件 文件夹
var oldRoot = path.join(__dirname, OLD_DIR );
// 新版本文件 文件夹(没有data的)
var newRoot = path.join(__dirname, NEW_DIR );
// 加了data要输出的 最新的 文件夹
var outputRoot = path.join(__dirname, OUTPUT_DIR);
// 旧文件的列表
var oldFileList = readDirSync(oldRoot);
// 新文件列表
var newFileList = readDirSync(newRoot);
// 读取path下的文件名称列表
function readDirSync(path) {
var files = [];
var pa = fs.readdirSync(path);
pa.forEach(function (ele, index) {
var info = fs.statSync(path + "/" + ele);
if (info.isDirectory()) {
// console.log("dir: " + ele);
readDirSync(path + "/" + ele);
} else {
// console.log("file: " + ele);
files.push(ele);
}
});
return files;
}
// 读取文件
async function cusReadFile(src) {
return new Promise((resolve) => {
let a = "";
const r = fs.createReadStream(src);
// r.setEncoding('utf-8');
r.on("data", (chunk) => {
a += chunk;
});
r.on("end", () => {
resolve(a);
});
r.on("error", () => {});
});
//
}
// 正式操作:新旧列表循环,找出名称相同的,将新的json里面放入data,并写入到outputRoot
newFileList.forEach((newItem) => {
oldFileList.forEach(async (oldItem) => {
if (newItem === oldItem) {
// 开始读
var oldContent = await cusReadFile(path.join(oldRoot, newItem));
var newContent = await cusReadFile(path.join(newRoot, newItem));
oldContent = JSON.parse(oldContent);
newContent = JSON.parse(newContent);
// console.log(oldContent.pens);
newContent.pens.forEach((item) => {
oldContent.pens.forEach((aitem) => {
if (item.id == aitem.id) {
// 数据处理
item.form = [
{
key: "data",
name: (aitem.data || {}).name || {} || "title",
type: "code",
title: "json",
language: "json",
isNotString: true,
},
];
item.data = aitem.data;
}
});
});
// 写文件
fs.writeFileSync(
path.join(outputRoot, newItem),
JSON.stringify(newContent)
);
}
});
});