我尝试计算给定目录以及所有子目录中所有文件的大小。这是我到目前为止的内容:
const fs = require('fs');
if (process.argv.length < 3) {
console.log("no argument given");
process.exit(-1);
}
const dir = process.argv[2];
let bytes = 0;
(getSize = async dir => {
fs.readdir (dir, (err, list) => {
list.forEach (file => {
fs.stat (dir + file, (err, stat) => {
if (stat.isDirectory()) {
getSize(dir + file + "/");
} else {
console.log(file + " [" + stat.size + "]");
bytes += stat.size;
}
});
});
});
})(dir);
setTimeout(() => {
console.log(bytes + " bytes");
console.log(bytes / 1000 + " Kbytes");
}, 500);
是否可以避免timeout
最终等待结果?我听说可以使用async
/ await
,但我不知道怎么做。如果可能的话,我也想保留这种通用的异步方法。
答案 0 :(得分:2)
承诺要容易一些。幸运的是,node有一个promisify
函数,可以将那些基于回调的函数转换为Promise返回函数。
const { promisify } = require('util');
const fs = require('fs');
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
async function getSize(dir) {
const files = await readdir(dir);
const sizes = await Promise.all(files.map(async file => {
const stats = await stat(dir + file);
return stats.isDirectory() ? getSize(dir + file + "/") : stats.size;
}));
return sizes.reduce((total, size) => total + size, 0);
}
const bytes = await getSize(process.argv[2]);
console.log(bytes + " bytes");
console.log(bytes / 1000 + " Kbytes");