Node.js 18下按规则查找目标文件夹逻辑异常问题排查
问题:寻找符合条件的文件夹路径失败
我有个文件夹路径列表spisok,要找列表里第一个满足两个条件的路径存到itog变量里:
- 当前文件夹大小小于1MB(1000000字节)
- 下一个文件夹大小≥100MB
之前试过Node.js 18的get-folder-size包没搞定,改用内置fs模块写了代码,结果itog拿到的是列表最后一个41MB的文件夹——这文件夹既不满足小于1MB的要求,后面也没别的项,完全不符合需求。
当前错误代码
// Step 1 const fs = require('fs'); const path = require('path'); const spisok = spisok; // Declare variables let pytkpystoypapke = ""; // path to found folder with size less than 1000000 bytes let itog = ""; // path to found folder will be saved in this variable // Loop through all folders in list "spisok" for (let i = 0; i < spisok.length; i++) { let folderSize = fs.statSync(spisok[i]).size; // get size of current folder if (folderSize < 1000000) { // check if size is less than 1000000 bytes if (i < spisok.length - 1) { // check if there is another folder in list "spisok" let nextFolderSize = fs.statSync(spisok[i + 1]).size; // get size of next folder if (nextFolderSize > 1000000) { // check if next folder size is greater than 1000000 bytes pytkpystoypapke = spisok[i]; // save path to current folder in "pytkpystoypapke" break; // exit the loop } } else { pytkpystoypapke = spisok[i]; // save path to current folder in "pytkpystoypapke" break; // exit the loop } } } itog = pytkpystoypapke; // save path to found folder in "itog" variable // Output result console.log(itog);
问题根源
- 文件夹大小获取错误:
fs.statSync().size拿到的只是文件夹自身的元数据大小(比如目录项占用的空间),不是文件夹里所有文件的总大小,这直接导致你判断的大小完全不准。 - 逻辑判断错误:当找到一个小于1MB的文件夹,但它的下一个不满足≥100MB时,代码没继续遍历后面的项;反而在遍历到最后一项时,不管条件直接赋值并退出循环,这就是为啥会拿到不符合要求的最后一项。
- 阈值设置错误:需求里下一个文件夹要≥100MB,但代码里判断的是
>1000000字节(也就是1MB),完全搞混了单位。
修正后的代码
const fs = require('fs'); const path = require('path'); // 递归计算文件夹总大小(字节) function calculateFolderSize(folderPath) { let totalSize = 0; const items = fs.readdirSync(folderPath); for (const item of items) { const itemPath = path.join(folderPath, item); const stats = fs.statSync(itemPath); if (stats.isDirectory()) { totalSize += calculateFolderSize(itemPath); } else { totalSize += stats.size; } } // 加上文件夹自身的元数据大小 totalSize += fs.statSync(folderPath).size; return totalSize; } const spisok = spisok; // 替换为你的实际路径列表 let itog = ""; // 只遍历到倒数第二项,确保有下一个元素 for (let i = 0; i < spisok.length - 1; i++) { const currentSize = calculateFolderSize(spisok[i]); const nextSize = calculateFolderSize(spisok[i + 1]); // 这里用十进制MB:1MB=1000000字节,100MB=100000000字节 // 如果要二进制MB(1MB=1048576字节),把数值改成1048576和104857600 if (currentSize < 1000000 && nextSize >= 100000000) { itog = spisok[i]; break; // 找到第一个符合条件的就停止遍历 } } console.log(itog);
注意事项
- 如果需要二进制单位的MB(1MB=1024KB),直接把阈值换成
1048576(1MB)和104857600(100MB)就行。 - 上面的计算函数是同步的,如果文件夹里文件很多,会阻塞Node.js的事件循环,需要异步版本的话可以改成
fs.promises搭配async/await实现。 - 确保运行代码的进程有足够的文件系统访问权限,不然会抛出权限错误。
内容的提问来源于stack exchange,提问作者Rist Som
相关产品推荐
相关产品推荐

