首页 > 使用nodejs在目录寻找其中没有指定文件有没有比较节省性能的算法?

使用nodejs在目录寻找其中没有指定文件有没有比较节省性能的算法?

目录下有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('没有找到符合要求的目录');
    }
});
【热门文章】
【热门文章】