目录下有5个文件夹,假设为12345,其中5是没有用的,需要在1234中执行。
然后1234每个文件夹中都有若干(大约几万个吧)个目录,要在这几万个目录中寻找储存1.xml但是没有2.xml的文件,如果找到一个算法就可以停止了。
对于检查文件是否存在可以用
fs.stat('file`, function(err, stats) {
if (err = null) {//file exists}
else if (err.code = ENOENT) {//no such file exists}
进行检查。
只需要找到一个符合条件的文件算法就可以停止了,但是由于文件众多请问有没有什么比较节省性能的方法?
1)对于一个目录下的文件来说,如果你的文件名是由规律的,按一定规则排序的话,那么可以利用到这个排序;例如你最多只判断前2个文件,而不需要遍历目录下的所有文件.文件名在一个目录下不能重复
2)如果文件名是没有规律的话,那么就需要遍历目录下的所有文件来匹配你的规则,在遇到2.xml文件时,可以提前退出遍历-可能此时已经到目录尾了
3) 在一个目录下找到符合条件的文件,那么剩余的目录不在需要遍历了
4)实际中一个目录下还需要考虑子目录的情况,故在遍历一个目录下的文件的时候,需要得到子类目的信息
以下是给具体的实现,你可以参考下~~
var fs=require('fs');
var path=require('path');
function readDir(startFolder,checkResultFun){
fs.readdir(startFolder,function(error,files){
var fileName;
var folders=[];
var resuslt=[0,0],tempMatchResult;
var notneedCheckFile=false;
for(var i=0;i<files.length;i++){
fileName=files[i];
var filePath=path.join(startFolder,fileName);
var fsStats=fs.statSync(filePath);//使用了同步版本的API
if(!notneedCheckFile&&fsStats.isFile()){
if(fileName==='1.xml'){
resuslt[0]=1;
}else if(fileName==='2.xml'){
resuslt[1]=1;
}
}else if(fsStats.isDirectory()){
folders.push(filePath);
}
//如果2.xml文件被找到,那么文件check没必要在继续,但是子目录还是需要得到
//故循环不能break
if(!notneedCheckFile&&resuslt[1]==1){
console.log('folder:%s not match the condition',startFolder);
notneedCheckFile=true;
}
}
//如果文件1.xml和2.xml文件条件满足,那么直接执行回调并结束函数。
if(resuslt[1]===0&&resuslt[0]==1){
console.log('folder:%s match the condition',startFolder);
folders=null;
checkResultFun(startFolder);
return;
}
//处理子目录,找到匹配时执行回调
function processNextFolder(){
var nextFolder=folders.shift();
if(nextFolder){
readDir(nextFolder,function(matchedFolder){
if(!matchedFolder){
processNextFolder();
}else{
checkResultFun(matchedFolder);
}
});
}else{
checkResultFun();
}
}
//如果有子目录,处理子目录
folders&&processNextFolder();
});
}
var startFolder='你指定的目录路径';
readDir(startFolder,function(matchedFolder){
if(matchedFolder){
console.log('找到符合要求的目录:%s',matchedFolder);
}else{
console.log('没有找到符合要求的目录');
}
});