diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java index 78e5410..b90b0b6 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java @@ -250,4 +250,57 @@ public class FileUtils String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); return encode.replaceAll("\\+", "%20"); } + + /** + * 处理文件名序号,生成不重复的文件名 + * + * @param baseName 基础文件名 + * @param existingNames 已存在的文件名列表 + * @return 处理后的文件名 + */ + public static String generateUniqueFileName(String baseName, java.util.List existingNames) + { + if (existingNames == null || existingNames.isEmpty()) + { + return baseName; + } + + java.util.List existingIndices = new java.util.ArrayList<>(); + + // 收集所有已存在的序号 + for (String existingName : existingNames) + { + if (existingName != null) + { + // 匹配格式:文件名(数字) + java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^" + java.util.regex.Pattern.quote(baseName) + "\\s*\\((\\d+)\\)$"); + java.util.regex.Matcher matcher = pattern.matcher(existingName); + if (matcher.find()) + { + int index = Integer.parseInt(matcher.group(1)); + existingIndices.add(index); + } + } + } + + // 排序序号列表 + java.util.Collections.sort(existingIndices); + + // 找到第一个可用的序号 + int availableIndex = 1; + for (int index : existingIndices) + { + if (index == availableIndex) + { + availableIndex++; + } + else if (index > availableIndex) + { + break; + } + } + + // 生成新的文件名 + return baseName + " (" + availableIndex + ")"; + } }