最近在做插件的时候,尝试获取每一个exml的类名缓存起来。这样做为了解决了插件不能通过连接跳转到对应的exml文件。 整个过程,一个网友给了一个很好优化的解决方案。监控相应的文件变化。这样来好处是不用每次去阻塞读取文件进行搜索判断。 下面遍历文件夹内的exml文件,并解析皮肤的类名。让其生成一个key value 对应关系。
【exml皮肤名】 = exml地址
var fs = require('fs');
var path = require('path')
var allExml = {};
//遍历读取文件
function geFileList(myPath)
{
var filesList = [];
readFile(myPath,filesList);
filesList.forEach( function(element) {
var xml = fs.readFileSync(element,"utf-8");
var array = xml.match(/class=\"(.*?)\"/)
if(array && array[1])
{
var className = array[1];
allExml[className] = element;
}
});
}
function readFile(filePath,filesList)
{
var files = fs.readdirSync(filePath);//需要用到同步读取
files.forEach(walk);
function walk(file)
{
var states = fs.statSync(filePath+'/'+file);
if(states.isDirectory())
{
readFile(filePath+'/'+file,filesList);
}
else
{
if(path.extname(file)==".exml")
{
filesList.push(filePath+'/'+file);
}
}
}
}
function writeFile(fileName,data)
{
fs.writeFile(fileName,data,'utf-8',complete);
function complete(err)
{
if(!err)
{
console.log("文件生成成功");
}
}
}
var tarpath = "G:\\egretdabao\\src"
var rePlaceStr = "G:\\egretdabao\\src/"
geFileList(tarpath);
var str ="";
var total = 0;
for(var key in allExml)
{
total++;
var temp = allExml[key].replace(rePlaceStr,'');
console.log(temp);
str+= ""+"\""+key+"\""+":" +"\""+temp+"\""+",\n";
}
str = str.substr(0,str.length-2);
var templet = "class ExmlMap {\n public constructor() {\n \n}\n public static filelen = #1; \n public static allMap ={#2};\n ";
templet = templet.replace("#2",str).replace("#1",total);
writeFile("exml.ts",templet);