批量处理文件研究(前端小伙子花式踩坑经历)
一、需求
现在需求是这样的:你现在要维护100多个同类型站点,每个站点大约有30多个模板文件,虽然目录和文件命名大体一致,但是由于网站系统升级,导致部分文件名变更,文件位置变更,于是现在要统一所有站点文件命名,对于这么大量的修改,第一时间想到的是批量处理文件。
二、实施
想了几个方案:
- 1、window自带的批量修改文件/文件夹
- 2、网上下载批处理软件
- 3、写bat批处理代码
- 4、写javaScript批处理代码
- 5、写nodeJs批处理代码
2.1 window自带的批量修改文件/文件夹
方案1:失败。虽然简单方便明了,但实际却得到失败的结果,可以批量重命名,但是居然重命名后自带了(1).cshtml,例如“公开信件内容页.cshtml”重命名为“公开咨询内容页.cshtml”;执行批量修改后居然都变成了“公开咨询内容页(1).cshtml”,相当蛋疼。而且不能批量移动文件、批量复制文件,放弃。
2.2 网上下载批处理软件
方案2:放弃。下载了2个软件,均不能满足需求。要么不能搜索文件名称、要么不能搜索子目录下的文件、要么不能搜索共享目录文件,而且下载软件还有中毒风险,放弃。
2.3 写bat批处理代码
方案3:放弃。bat批处理其实是最合适的做法,但网上搜了些代码,看到那些非常反人类的语法后放弃了。
2.4 写javaScript批处理代码
方案4:呕血。一开始我是用javaScript写的批处理代码,由于ie的fso是可以操作文件的,所以一开始比较顺利,已经做到把所需要批处理的文件搜出来了,但是居然不能重命名文件,可以增加、删除、移动、复制,就是不能重命名,呕血。
使用ie下的fso读取所需文件:
2.5 写nodeJs批处理代码
方案5:成功。无奈之下只能用nodeJs了,结果成功了,而且速度比ie的fso快1倍。
批量修改文件名:
nodejs代码:
功能:读取指定路径文件夹下的所有文件(含子文件夹)并重命名
var fs = require("fs")
var path = require("path")
var root = path.join("\\\\c:\\文件\\");
var oldName = "旧文件名.cshtml";
var newName = "新文件名.cshtml";
//读取root路径文件夹下的所有文件并重命名
readDirSync(root)
function readDirSync(path){
var pa = fs.readdirSync(path);
pa.forEach(function(ele,index){
var info = fs.statSync(path+"/"+ele)
if(info.isDirectory()){
readDirSync(path+"/"+ele);
}else{
if(ele == oldName){
var oldFile = path+"/"+ele;
reName( oldFile, path+"/"+newName );
}
}
})
}
//重命名
function reName( oldPath,newPath ){
fs.rename( oldPath, newPath, function (err) {
if(err) {
console.error(err);
return;
}
console.log(oldPath +" 重命名为\n" + newPath)
});
}
三、总结
本例只演示了nodejs批量重命名方法,当然还有 增加、删除、移动、复制 等所有文件操作,有需要我会总结出来。