fs和path
NodeJS中的fs模块专门用于处理文件,path模块用于处理路径
利用这两个模块就可以自己实现对文件夹中所有文件大小的计算
同步计算方法
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)
}
异步计算方法,使用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)
})
calcSizeSync(‘test‘,(err,size)=>{
if(err) console.log(err)
else console.log("同步执行文件大小:"+size)
})