本文介绍使用Node.js遍历文件夹并统计文件大小的方法。通过递归读取目录,获取所有文件信息并按大小排序,生成包含文件名、大小及路径的文本文件。该工具可用于前端项目优化,帮助快速定位大尺寸图片等资源文件,提升加载效率。
背景与问题描述
离职两个多月后,回顾过往工作,曾开发不少工具。但在离职当天,我将过去一年积累的所有工具和代码全部格式化清除。今日想起项目中遇到的一个具体问题,特此记录。
在优化内存时,发现部分图片加载时loading状态迟迟不消失。经排查,部分技能图标尺寸仅为50x50像素,但图片文件体积却高达数MB。追溯路径发现,美术人员导出图标时未进行压缩,导致文件体积过大,进而引发加载缓慢、持续loading的问题。
项目中美术资源多达数千张,逐一排查极为耗时。利用空闲时间,尝试使用Node.js的文件系统API编写了一个小型Demo,成功满足了需求。该工具帮助快速定位问题图片,并通知美术人员修改,从而高效解决了问题。
统计文件大小是一项实用功能。前端团队可依据统计结果,针对性地压缩体积较大的图片。拥有数据参考后,定位问题变得十分便捷。
Node.js实现方案
接下来,使用Node.js遍历文件夹内容,读取所有文件,并按大小从大到小排序输出,最终生成一个已排序的文件列表。通过该文件,可以直观查看哪些文件体积较大。
var fs = require('fs')
//遍历文件夹,获取所有文件夹里面的文件信息
/*
* @param path 路径
*
*/
function geFileList(path)
{
var filesList = [];
readFile(path,filesList);
return filesList;
}
//遍历读取文件
function readFile(path,filesList)
{
files = fs.readdirSync(path);//需要用到同步读取
files.forEach(walk);
function walk(file)
{
states = fs.statSync(path+'/'+file);
if(states.isDirectory())
{
readFile(path+'/'+file,filesList);
}
else
{
//创建一个对象保存信息
var obj = new Object();
obj.size = states.size;//文件大小,以字节为单位
obj.name = file;//文件名
obj.path = path+'/'+file; //文件绝对路径
filesList.push(obj);
}
}
}
//写入文件utf-8格式
function writeFile(fileName,data)
{
fs.writeFile(fileName,data,'utf-8',complete);
function complete()
{
console.log("文件生成成功");
}
}
var filesList = geFileList("G:/nodejs");
filesList.sort(sortHandler);
function sortHandler(a,b)
{
if(a.size > b.size)
return -1;
else if(a.size < b.size) return 1
return 0;
}
var str='';
for(var i=0;i<filesList.length;i++)
{
var item = filesList[i];
var desc ="文件名:"+item.name + " "
+"大小:"+(item.size/1024).toFixed(2) +"/kb"+" "
+"路径:"+item.path;
str+=desc +"\n"
}
writeFile("test.txt",str);
使用方法与注意事项
使用方法十分简单:将代码中的 `var filesList = geFileList(“G:/nodejs”);` 里的路径参数修改为你需要遍历的目标路径。更改参数后,即可遍历指定文件夹下的所有文件,并生成一份排序好的文件列表。
当文件数量较多时,建议使用功能更强大的文本编辑器打开结果文件,以便于阅读和查看。
以下是生成的文件大小列表示例。
