# 使用 node 开发一个能完成对指定路径下的指定文件完成指定扫描的工具 **Repository Path**: dapeng15042435737/node_tool_lf_scan ## Basic Information - **Project Name**: 使用 node 开发一个能完成对指定路径下的指定文件完成指定扫描的工具 - **Description**: 使用 node 对大量HTML文件内容进行扫描,找到不符合设计要求的HTML文件,并生成扫描结果报告文件,供开发人员使用。 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-24 - **Last Updated**: 2021-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: Nodejs ## README # 使用 node 开发一个能够完成对指定路径下的指定文件完成指定扫描的工具 ## 开发背景 最近在工作中遇到这样一个问题,用户访问公司早些年开发过的嵌入式设备中的个别HTML后,设备的操作面板会出现无法操作的现象,通过设备运行的log发现,原来是当用户访问这几个发生问题的HTML时,设备从大容量FLASH中读取问题HTML数据时,认为没有读完,一直占据了CPU,导致其他功能无法使用。 为什么会没有读完呢,就是因为当时规定一个HTML数据的结束标志是最后一个字节设定为0x0A (LF), 但是出问题的那几个HTML数据的最后一个字节没有0x0A (LF), 因此读取HTML数据的模块始终认为没有读完HTML数据。 发现这个原因之后,总体对策就是找到还有哪些有同样问题的HTML,找到这些HTML,然后在最后加上一个字节的0x0A. 但是我发现这个设备的前端当时采用ifream,也就是说HTML里可以套用HTML,结果导致这个设备的HTML个数非常庞大,大概有1107个文件。 这样的话,人工检查是不现实的。 ## 方案提出 我的解决方案就是使用node开发一个扫描指定路径里HTML的工具。 具体如下: 首先查找这个路径里所有文件包括路径,如果是文件的话,则判断扩展名是否是HTM,如果是的话,则判断最后一个字节是否是0x0A (LF), 如果不是,则向扫描log文件中记录该文件是NG。 如果是路径的话,则递归执行以上步骤。所有文件和路径执行完后,log文件的内容就是我们要找的HTML问题文件。 ## node技术的应用 既然要对文件进行扫描,就需要使用node的fs/path。 ### fs模块 主要负责文件的读取(内容扫描),文件类型的判断(文件和路径的判断),文件的写入(log实现) ### path模块 主要负责提取路径 ## 软件主要函数介绍 # 入口函数 删除已经存在的LOG文件,并且开始扫描用户指定的路径 ```javascript async function run(name){ try { let log_path = path.join(__dirname, 'scan_log.txt') await deleteScanLog(log_path); await scanDir(name, log_path); } catch (error) { console.log(error); } } ``` # 删除LOG函数 如果LO文件存在,则删除 ```javascript async function deleteScanLog(name){ try { let isExist = await exist(name); console.log(isExist); if(isExist){ await rm(name); } } catch (error) { throw new Error('deleteScanLog' + ' : ' + error); } } ``` # 写入LOG函数 扫描完的结果可以通过这个函数写入LOG文件 ```javascript async function writeScanLog(name, data){ if(data.length != 0){ try { await writeFile(name, data + '\n', {'flag':'a'}); } catch (error) { throw new Error('writeScanLog' + ' : ' + error); } }else{ throw new Error('writeScanLog' + ' : ' + '没有设定写入LOG的内容,暂停执行,请检查程序'); } } ``` # 扫描文件内容函数 负责检查HTML文件的末尾是否存在0x0A ```javascript async function scanContent(file_name){ try { let ret = 'NG (文件末尾没有LF)'; let data = await readFile(file_name); if(data.length != 0){ //判断结尾最后一个字节是否为0x0A(LF) if(data[data.length - 1] == 10){ ret = 'OK (文件末尾有LF)'; } }else{ ret = 'NG (文件为空)'; } return ret; } catch (error) { throw new Error('scanContent' + ' : ' + error); } } ``` # 判断文件的类型函数 负责判断当前的文件类型是文件还是路径,如果是路径为了递归做准备。 ```javascript async function judgeFileType(file_name){ try { let info = await getStat(file_name); if(info.isDirectory()){ //判断当前文件类型是否是路径 return 'dir'; }else if(info.isFile()){ //判断当前文件类型是否是文件 return 'file'; } } catch (error) { throw new Error('judgeFileType' + ' : ' + error); } } ``` # 取得文件扩展名函数 负责取得当前文件的扩展名,为了判断是否是HTML做准备。 ```javascript function getExtname(name){ let result = path.extname(name).split('.'); return result[result.length - 1]; } ``` # 扫描文件路径的函数 负责扫描当前的路径,取得当前路径下的所有文件,判断扩展名,判断类型, 如果是路径的话,继续递归,如果是HTML文件的话,则扫描内容。 ```javascript async function scanDir(dir_name, log_name){ try { let log_data = ''; let info = await readDir(dir_name); //如果指定路径下不是空 if(info.length != 0){ // console.log(info); //遍历当前路径下的所有文件 for(let i=0;i<=info.length-1;i++){ //判断遍历文件的类型 let sub_path = path.join(dir_name,info[i]); // console.log('sub_path : ' + sub_path); let type = await judgeFileType(sub_path); if(type == 'dir'){ //如果是路径的话,则递归调用 await scanDir(sub_path, log_name); }else if(type == 'file'){ //如果是文件的话,则取文件的扩展名 let ext = getExtname(sub_path); if(ext == 'htm'){ //当前的文件是html的话,则扫描文件内容。 //判断最后一个字节是否是0x0A let scan_ret = await scanContent(sub_path); log_data = sub_path + ' : '+ scan_ret; }else{ log_data = sub_path + ' : 检测对象外'; } await writeScanLog(log_name, log_data); } } }else{ //如果没有任何文件的话,则记录该路径下没有任何文件 //console.log(dir_name + ' : ' +'该路径下没有任何文件'); log_data = dir_name + ' : ' +'该路径下没有任何文件'; await writeScanLog(log_name, log_data); } } catch (error) { throw new Error('scanDir' + ' : ' + error); } } ``` ## 安装教程 1. node安装 ## 使用说明 1. 终端执行 node lf_scan.js 2. 查看scan_log.txt ![输入图片说明](https://images.gitee.com/uploads/images/2021/1124/162744_c129dbab_9851214.png "142300_a817018f_9851214.png") ## 使用效果 最后对1107个HTML文件进行自动扫描,用时3秒完成,所有结果都记录在了scan_log.txt中,在1107个文件中发现有问题文件10个。 ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request