当前位置: 首页 > 后端技术 > Node.js

nodejs遍历文件夹,操作HTML-CSS-JS-PNG-JPG

时间:2023-04-03 22:50:37 Node.js

需求描述。由于工作需要,需要将原来1280720的网页改成19201080的网页(电视页面)。需求可以拆分成两部分,代码部分的修改和图片的修改。在代码部分,需要将所有位置和大小相关的值乘以1.5,图片的大小也要放大1.5倍。先用nodejs遍历当前文件夹://遍历所有文件varfs=require("fs")varpath=require("path")varrelativePath='\\test'//获取需要遍历的路径varroot=path.join(__dirname)+relativePathreadDirSync(root)//使用异步获取路径//参数为遍历文件的根路径functionreadDirSync(path){varpa=fs.readdirSync(path);//遍历当前文件和文件夹pa.forEach(function(ele,index){varinfo=fs.statSync(path+"\\"+ele)if(info.isDirectory()){//console.log("dir:"+ele)readDirSync(path+"\\"+ele);}else{varfilePath=path+'\\'+ele;//找到.css.html.js文件letfileNameReg=/\.css|\.js|\.html|\.htm/g;letshouldFormat=fileNameReg.test(filePath);if(shouldFormat){console.log('findfile:',filePath);//这里我们得到合格的文件路径,后面可以根据这个路径进行相关操作}}})}如果是HTMLCSSJS文件,使用nodejs文件相关API操作文件,先读文件,再写文件。代码:varformatObj=newChangePosFor4K();//创建一个对象,构造函数在下面functionreadFile(params){//读取文件的例子fs.readFile(params,function(err,data){if(err){console.log('读取文件时发生错误,erroris'+err)}else{varcodeTxt=data.toString();//使用object修改文件内容,执行position和size-相关值展开varformatReturn=formatObj.formatNumber(codeTxt);codeTxt=formatReturn.code;//给不同的文件添加不同的注释letjsFileReg=/.js$/i;lethtmlFileReg=/.html$|.htm$/i;letcssFileReg=/.css$/i;lettip1='autoformattingtoolhascheckthisfile.'lettip2='blockhasbeenhandleinthiscode.'letnow=newDate();if(jsFileReg.test(params)||cssFileReg.test(params)){codeTxt+='\n/*'+tip1+'*/'codeTxt+='\n/*'+formatReturn.times+''+tip2+'在'+现在+'*/'}elseif(htmlFileReg.test(params)){codeTxt+='\n'codeTxt+='\n'}//将修改后的内容写入当前路径下的文件writeFile(params,codeTxt);}})}//写入文件//fs.writeFile(file,data[,options],callback)//file-文件名或文件描述符//data-要写入文件的数据,可以是一个String(字符串)或Buffer(流)对象。//options-此参数是一个包含{encoding,mode,flag}的对象。默认编码为utf8,mode为0666,flag为'w'//callback-回调函数,回调函数只包含错误信息参数(err),写入失败时返回。functionwriteFile(_path,_txt){fs.writeFile(_path,_txt,function(err){if(err){console.log('写入文件时出错,错误为'+err)}else{console.log("格式化文件成功:",_path);}})}//样式操作相关/**fun:*/functionChangePosFor4K(){varformat=/\d+px/gi;vartempSufixx='@@'//临时占位符,因为需要匹配正则数字+px,修改后的不能再有pxthis.formatNumber=function(arg){//匹配数字的所有组合和pxdd.pxvarinitalStr=arg;varlocIndex=initalStr.search(格式);//获取起始索引varchangeTimes=0;while(locIndex>0){//获取值varlocStr=getFullPos(initalStr,locIndex);//乘以相对比varlocValue=Math.ceil(parseInt(locStr)*1.5);varlocReplaceStr=locValue+tempSufixx;//替换initalStr=replaceStr(initalStr,locIndex,locStr.length,locReplaceStr);locIndex=initalStr.search(格式);//计算changeTimes++;}varlocReg=newRegExp(tempSufixx,'gi')initalStr=initalStr.replace(locReg,'px');返回{code:initalStr,times:changeTimes};}//根据字符串和起始位置找到xxx.px字符串functiongetFullPos(_str,_begin){v??aroutput='';while(output.indexOf('px')<0){//当没有找到完整的字符串时output+=_str.charAt(_begin);_开始++;}返回输出;}//被替换元素,根据起始索引,替换长度,替换元素functionreplaceStr(_str,_begin,_len,_subStr){//先将字符串和拼接后的字符串转换成数组varstrArr=_str.split('');varsubStrArr=_subStr;//完成替换strArr.splice(_begin,_len,subStrArr);返回strArr.join('');}}至此,代码相关的操作就结束了。接下来,我们将使用gm来操作图像。首先通过npm安装gm,安装ImageMagick或GraphicsMagick软件。代码:varfs=require('fs');//可以选择两个图像操作的底层程序vargm=require('gm').subClass({ImageMagick:true});varpath=require("path")varrelativePath='\\test'varroot=path.join(__dirname)+relativePath//放大图片并复制functionmagnifyImg(_path){//获取当前图片的长宽//放大长度和宽度增加1.5倍//设置新的图像大小//没有直接调用magnify因为magnify不支持小数gm(_path).size(function(err,size){if(!err){//console.log(size.width>size.height?'wider':'比你高');letnowWidth=parseInt(size.width);letnowHeight=parseInt(size.height);letmagnifyWidth=Math.floor(nowWidth*1.5);让magnifyHeight=Math.floor(nowHeight*1.5);gm(_path).resizeExact(magnifyWidth,magnifyHeight).write(_path,function(err){if(!err)console.log(_path+'完成');否则console.log(_path+'fail'+err);})}else{console.log('getsize有错误'+_path+'anderr是 :'+err);}})}至此,函数完成。比较感人的是操作代码中的相关位置和实现尺寸的过程中,遇到了一些困难。一开始不知道怎么在文件中找到所有满足条件的字符。此外,我不知道如何替换找到的字符。我一般使用字符串replace方法,但是replace方法会将符合条件的地方全部replace删除。定位和替换是后面根据index和length实现的。图片的操作是根据别人写的自行百度完成的。借助ImageMagic工具,还是可以实现非常丰富的功能的。详情参见gm的GitHub。但是放大的api不支持小数位放大,所以需要多走一步,先获取当前大小,再设置大小。同样,图片在放大的过程中,也会出现拉伸模糊的问题。如果对画面质量有很高的要求,最后还是应该由美工来完成。可以弥补艺术上的不足。猜的坑是replace方法,replace方法不会改变原来的字符串。这次的顺利完成,主要是正则表达式的功劳。学好正则表达式对于数据处理还是很重要的。后面会总结学习正则表达式,完成知识的输出。