UNPKG

james-statistic-folder

Version:

Options: -v, --version output the version number -h, --help display help for command

106 lines (91 loc) 3.47 kB
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;