node.js获取目录内所有文件大小总和
# 同步计算方法
const fs=require('fs')
const path=require('path')
// 同步计算,利用回调函数和递归来完成多层级目录中的文件大小计算
function calcSizeSync(dirPath,cb){
let fileSize=0
let error=null
function calc(dirPath,cb1){
const statObj=fs.statSync(dirPath)
if(statObj.isDirectory()){
try {
const files=fs.readdirSync(dirPath)
let dirs=files.map(item=>{
return path.join(dirPath,item)
})
let index = 0
function next () {
if (index < dirs.length) return cb1&&cb1()
let current = dirs[index++]
calc(current, next)
}
next()
} catch (err) {
error=err
}
}else{
fileSize+=statObj.size
cb1&&cb1()
}
}
calc(dirPath)
cb(error,fileSize)
}
// 测试
calcSizeSync('test',(err,size)=>{
if(err) console.log(err)
else console.log("同步执行文件大小:"+size)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 异步计算方法,使用async/await
const fs=require('fs')
const path=require('path');
// 使用promisify方法来promise化指定方法
const { promisify } = require('util');
stat=promisify(fs.stat)
readdir=promisify(fs.readdir)
// 异步
async function calcSize(dirPath,cb){
let fileSize=0;
let error=null
async function calc(dirPath){
try {
const statObj=await stat(dirPath)
if(statObj.isDirectory()){
const files=await readdir(dirPath)
let dirs=files.map(item=>{
return path.join(dirPath,item)
})
let index = 0
async function next () {
if (index < dirs.length){
let current = dirs[index++]
await calc(current)
await next()
}
}
return await next()
}else{
fileSize+=statObj.size
}
} catch (err) {
error=err
}
}
await calc(dirPath)
cb(error,fileSize)
}
// 测试
calcSize('test',(err,size)=>{
if(err) console.log(err)
else console.log("异步执行文件大小:"+size)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 其他方法
/**
* 获取指定目录内所有文件大小总和 单位为字节
* @param dir
* @param callback
*/
function getdirsize(dir,callback){
var size = 0;
fs.stat(dir,function(err,stats){
if(err) return callback(err);//如果出错
if(stats.isFile()) return callback(null,stats.size);//如果是文件
fs.readdir(dir,function(err,files){//如果是目录
if(err) return callback(err);//如果遍历目录出错
if(files.length==0) return callback(null,0);//如果目录是空的
var count = files.length;//哨兵变量
for(var i = 0;i<files.length;i++){
getdirsize(path.join(dir,files[i]),function(err,_size){
if(err) return callback(err);
size+=_size;
if(--count<=0){//如果目录中所有文件(或目录)都遍历完成
callback(null,size);
}
});
}
});
});
}
var walk = function(dir, done) {
//var results = [];
var size = 0;
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var pending = list.length;
if (!pending) return done(null, size);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
size = size+res;
if (!--pending) done(null, size);
});
} else {
size = size+stat.size;
if (!--pending) done(null, size);
}
});
});
});
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
上次更新: 2024/02/20, 17:31:36
- 01
- linux 在没有 sudo 权限下安装 Ollama 框架12-23
- 02
- Express 与 vue3 使用 sse 实现消息推送(长连接)12-20