如何用JS复制文件并以不重复随机数重命名,解决号码重复问题
问题根源
核心问题是存储可用随机数的数组numbersArray被放在了循环体内部:
- 每遍历1个原文件,你就会重新生成一份包含1~50全部数字的新数组
- 每次从全新的数组里取随机数、删除元素的操作,完全不会影响下一次循环的取值,自然就会出现大量重复的随机编号,导致文件覆盖、复制失败。
核心改动点
- 把工具函数定义、可用随机数数组初始化放到循环外部,全局只执行一次
- 新增了new文件夹自动创建逻辑,避免目标路径不存在导致复制失败
- 替换成同步复制方法+错误捕获,方便初学者定位问题,对性能有要求可以自行替换为fs.promises.copyFile的异步写法
修复后代码
const fs = require('fs'); const path = require('path'); // 工具函数全局仅定义一次 function getRandomNumber(min, max) { const totalEle = max - min + 1; return Math.floor(Math.random() * totalEle) + min; } function createArrayOfNumber(start, end) { const myArray = []; for (let i = start; i <= end; i++) { myArray.push(i); } return myArray; } // 可用随机数数组仅初始化一次 const numbersArray = createArrayOfNumber(1, 50); // 自动创建目标文件夹,避免路径不存在报错 if (!fs.existsSync('./new')) { fs.mkdirSync('./new'); } // 循环处理所有原文件 for (let i = 1; i <= 50; i++) { const randomIndex = getRandomNumber(0, numbersArray.length - 1); const randomNumber = numbersArray[randomIndex]; // 取出编号后立即从可用数组删除,确保不会重复 numbersArray.splice(randomIndex, 1); try { fs.copyFileSync( path.join('./old', `${i}.json`), path.join('./new', `${randomNumber}.json`) ); } catch (err) { console.error(`复制文件${i}.json失败:`, err.message); } }
内容的提问来源于stack exchange,提问作者Joss
相关产品推荐
相关产品推荐

