james-statistic-folder
Version:
Options: -v, --version output the version number -h, --help display help for command
106 lines (91 loc) • 3.47 kB
JavaScript
const fs = require('fs');
const path = require('path');
/*
流程梳理:
1. 根据入口entry,获取里面第一层的所有文件和目录 存放在this.folders中
2. 遍历this.folders, 继续获取里面文件的信息,如果是文件夹就继续递归遍历,如果是文件,就累加大小
3. 对象按照属性排序(size)
4. 文件输出
*/
class StatisticFolderSize {
constructor(options = {}){
this.options = options;
// 文件夹信息表,用于统计文件夹大小
this.map = {};
}
// 初始化
init(){
// 1. 根据入口entry,获取里面第一层的所有文件和目录
this.entryHandle();
console.log('===this.folders===', this.folders);
// 2. 遍历文件夹继续获取里面文件的信息,如果是文件夹就继续递归遍历,如果是文件,就累加大小
this.traverseAllFolders();
// 3. 对象按照属性排序
this.map = this.objSort(this.map, 'size');
// 4. 文件输出
this.write(this.map);
}
// 根据入口entry,获取里面第一层的所有文件和目录
entryHandle(){
// 返回给定文件路径的信息
let stats = fs.statSync(this.options.entry);
// 选择的入口路径是目录
if(stats.isDirectory()){
// fs.readdirSync方法将返回一个包含“指定目录下所有文件名称”的数组对象
this.folders = fs.readdirSync(this.options.entry);
}
// 选择的入口路径是文件
else {
this.folders = [];
}
}
// 利用递归,获取文件夹内所有文件大小,然后累加统计
readFile(path, obj){
// 获取文件夹内部文件
let files = fs.readdirSync(path);
files.forEach((file)=>{
let url = path + '/' + file;
// 获取文件信息
let stats = fs.statSync(url);
if(stats.isDirectory(url)) {
this.readFile(url, obj);
}else {
obj.size += stats.size;
}
});
}
// 遍历所有的folders
traverseAllFolders() {
// 用户选择的是文件,就不处理
this.folders.length && this.folders.forEach((folder)=>{
let url = path.resolve(this.options.entry, `./${folder}`);
// 只对文件夹进行统计
let states = fs.statSync(url);
if(states.isDirectory(url)){
this.map[folder] = {
size: 0
};
this.readFile(url, this.map[folder]);
}
});
}
// 对象按照属性排序(从大到小)
objSort(map, property) {
// obj => array
let objToArr = Object.entries(map);
let newArr = objToArr.sort(([, a], [, b]) => b[property] - a[property]);
// B => KB
newArr = newArr.map((item)=>{
item[1].size = (item[1].size / 1024).toFixed(2) + 'KB';
return item;
});
// array => obj
let obj = Object.fromEntries(newArr);
return obj;
}
// 输出结果
write(map){
fs.writeFileSync(this.options.output, JSON.stringify(map, null, 2), 'utf8');
}
};
module.exports = StatisticFolderSize;