gpt4 book ai didi

javascript - Nodejs异步递归文件夹大小

转载 作者:搜寻专家 更新时间:2023-10-31 23:53:20 25 4
gpt4 key购买 nike

您好,我是 Javascript、Nodejs 及其异步世界的新手,我正在尝试以异步方式获取文件夹列表(如 du 命令)的大小。像这样的东西:

du = function(directory, callback){
...
}

displaySum = function(err, result) {
if(!err) {console.log(result);}
}

var folders = ['/folder1', '/folder2', '/folder3'];
for (var i = 0; i < folders.length; i++) {
du(folders[i], displaySum);
}

我期望的是以异步方式从回调中获取结果,因此当 du 完成 folderN 时,回调会打印出 folderN 的结果。

我尝试使用来自 here 的代码使用柯里化(Currying)和闭包:

//Pseudocode
duAsync4 = (dir,cb) ->
total = 0
file_counter = 1 #starts at one because of the initial directory
async_running = 0

again = (current_dir) ->
fs.lstat current_dir, (err, stat) ->
if err then file_counter--; return
if stat.isFile()
file_counter--
total += stat.size
else if stat.isDirectory()
file_counter--
async_running++
fs.readdir current_dir, (err,files) ->
async_running--
if err then return #console.log err.message
file_counter += files.length
for file in files
again path.join(current_dir, file)
else
file_counter--
if file_counter is 0 and async_running is 0
cb(null, total)

again dir

我在使用Closures 的代码中遇到的问题是,如果第二次调用du 时第一次调用仍在进行中,那么一切都会变得一团糟,因为闭包重新使用 total、file_counter 和 async_running 的当前值。

最佳答案

我觉得回调有点麻烦,所以使用 Promise 它仍然是异步的,希望评论澄清事情...

var fs = require('fs')
, path = require('path');

function getSize(dirPath){
return getStat(dirPath).then(function(stat){
if(stat.isFile()){ // if file return size directly
return stat.size;
}else{
return getFiles(dirPath).then(function(files){ // getting list of inner files
var promises = files.map(function(file){
return path.join(dirPath, file);
}).map(getSize); // recursively getting size of each file
return Promise.all(promises);
}).then(function(childElementSizes){ // success callback once all the promise are fullfiled i. e size is collected
var dirSize = 0;
childElementSizes.forEach(function(size){ // iterate through array and sum things
dirSize+=size;
});
return dirSize;
});
}
});
}

// promisified get stats method
function getStat(filePath){
return new Promise(function(resolve, reject){
fs.lstat(filePath, function(err, stat){
if(err) return reject(err);
resolve(stat);
});
});
}

// promisified get files method
function getFiles(dir){
return new Promise(function(resolve, reject){
fs.readdir(dir, function(err, stat){
if(err) return reject(err);
resolve(stat);
});
});
}

// example usage
getSize('example dir').then(function(size){
console.log('dir size: ', size);
}).catch(console.error.bind(console));

关于javascript - Nodejs异步递归文件夹大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34016861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com