You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:15:00