js循环nodelist_nodejs异步循环获取目录下所有文件

这段代码展示了如何使用Node.js异步遍历目录及其子目录,获取所有文件路径。通过fs模块的stat和readdir方法,递归处理每个目录,并通过回调函数协调异步操作。最终输出所有遍历到的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var path = node_path.join(__dirname, dir_path)

var dirs = [];

var over_dir=[];

var over=[];

dirs.push(path)

function forDir(dirs) {

function forFiles(files, file_path) {

var fixdir = [];

files.forEach(function (e, i) {

var e = node_path.join(file_path,e)

fs.stat(e, function (err, stat) {

if (stat.isDirectory()) {

fixdir.push(e)

over_dir.push(e)

}else{

over.push(e)

}

if (i == files.length - 1) {

if(file_path==over_dir[over_dir.length-1]){

console.log(over)

}

if(fixdir.length>0){

forDir(fixdir)

}

}

})

})

}

dirs.forEach(function (e, i) {

fs.readdir(e, function (err, files) {

forFiles(files,e)

})

})

}

forDir(dirs)

代码修改了下

分成2大块

1 多个目录遍历调用

2 处理一个目录下文件类型异步判别的

3 处理指定目录下文件列表异步读取的

1 调用 2 调用 3

3 处理完通知 2 处理完通知1

var path = node_path.join(__dirname, "../");

var dirs = [];

dirs.push(path);

/**

* 处理某个类目下所有文件及目录

* @param files 文件。也可能是目录

* @param file_path 文件或目录的上级目录

* @param callback 一个目录或文件的判断结果的回调

* @param allFilesDoneCallback 所有文件处理完成后的回调函数

*/

function forFiles(files, file_path,callback,allFilesDoneCallback) {

var arrlength=files.length;

if(!files||files.length==0){

allFilesDoneCallback(file_path);

return;

}

files.forEach(function (e, i) {

var fullFilePath = node_path.join(file_path,e);

fs.stat(fullFilePath, function (err, stat) {

var result={

isDir:false,

isFile:true,

file:fullFilePath

};

if (stat.isDirectory()) {

result.isDir=true;

result.isFile=false;

}else{

result.isDir=false;

result.isFile=true;

}

//回调

callback(result);

arrlength--;

//判断是否处理完毕

if(arrlength==0){

//回调所有文件处理完毕

allFilesDoneCallback(file_path);

}

});

});

}

/**

* 处理单个目录

* @param dirPath 目录路径

* @param watchDir 监控的目录列表

* @param callback 当目录处理完毕后的回调函数

*/

function forDir(dirPath,watchDir,callback){

fs.readdir(dirPath, function (err, files) {

var subFiles=[];

forFiles(files,dirPath,function(result){

//如果是目录,继续执行forDir并在之前将目录添加到watchDir

//如果是文件,放入subFiles中

if(result.isDir){

watchDir.push(result.file);

forDir(result.file,watchDir,callback);

}else{

subFiles.push(result.file);

}

},function(processedDirPath){//文件全部处理完毕后,执行回调函数通知指定目录遍历完毕,但不包括子目录

callback(processedDirPath,subFiles);

});

});

}

/**

* 遍历处理多个类目

* @param dirs 多个类目列表

* @param doneCallback 处理完成的回调

*/

function forDirs(dirs,doneCallback) {

var copiedDirs=dirs.slice(0);

var watchDir=[];

var allFiles=[];

copiedDirs.forEach(function(path){

watchDir.push(path);

//回调函数中判断watchDir长度是否为0,如为0,表示所有的目录及其子目录处理完毕了,通知最外层处理完毕

//并将返回的文件信息合并

forDir(path,watchDir,function(processedDirPath,subFiles){

allFiles=allFiles.concat(subFiles);

console.log('%s 处理完成',processedDirPath);

watchDir.splice(watchDir.indexOf(processedDirPath),1);

if(watchDir.length==0){

doneCallback(allFiles);

}

});

})

}

forDirs(dirs,function(fileList){

console.log('所有目录遍历完成,获取到文件个数为:%d',fileList.length);

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值