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

Java批量按规则重命名文件代码运行后未生效问题求助

问题排查结果

  • 路径拼接错误:目标文件名拼接时,父目录D:\\LibriInformatica和文件名之间缺少路径分隔符\\,最终生成的路径是非法的,比如会变成D:\LibriInformatica测试.pdf而非正确的D:\LibriInformatica\测试.pdf,重命名自然无法生效。
  • 重命名时机错误:每匹配一个规则就调用一次renameTo,如果一个文件同时匹配多个规则,第一次重命名后原文件已经不存在,后续的重命名操作全部会失败。应该先计算出最终的目标文件名,再统一执行一次重命名。
  • 文件名处理逻辑漏洞:每次分割后直接拼接.pdf,会导致原本已经带.pdf后缀的文件变成xxx.pdf.pdf的双后缀;直接使用路径分割取titolo[2]的逻辑非常脆弱,一旦目录层级发生变化就会触发数组越界,不如直接调用File类的getName()方法直接获取文件名。
  • 没有异常/返回值校验:renameTo方法是有布尔返回值的,返回false就代表重命名失败,原代码没有做任何校验,也没有处理文件被占用、目标文件已存在、权限不足等常见异常场景。

修正后代码

import java.io.File;

public class ChangeName {

    public static void main(String[] args) {
        File cartella = new File("D:\\LibriInformatica");
        // 先校验目录合法性
        if (!cartella.exists() || !cartella.isDirectory()) {
            System.out.println("目标目录不存在");
            return;
        }
        File[] listaDiFile = cartella.listFiles();
        if (listaDiFile == null) {
            System.out.println("无法读取目录下的文件");
            return;
        }
        String parentPath = cartella.getAbsolutePath() + File.separator;
        for (File file : listaDiFile) {
            if (file.isFile()) {
                // 直接获取原始文件名,不需要拆分路径
                String originalName = file.getName();
                String fileName = originalName;
                String suffix = "";
                // 分离文件名和后缀,避免重复加.pdf
                int dotIndex = originalName.lastIndexOf(".");
                if (dotIndex > 0) {
                    fileName = originalName.substring(0, dotIndex);
                    suffix = originalName.substring(dotIndex);
                }

                // 依次处理重命名规则,仅修改文件名部分
                if (fileName.contains("( PDFDrive )")) {
                    fileName = fileName.split("\\( PDFDrive \\)")[0].trim();
                }
                if (fileName.contains("_")) {
                    fileName = fileName.split("_")[0].trim();
                }
                if (fileName.contains("-")) {
                    fileName = fileName.split("-")[0].trim();
                }

                // 生成最终文件名
                String finalName = fileName + suffix;
                File targetFile = new File(parentPath + finalName);
                // 跳过同名文件
                if (targetFile.exists()) {
                    System.out.println("目标文件" + finalName + "已存在,跳过" + originalName);
                    continue;
                }
                // 执行重命名并判断结果
                boolean renameResult = file.renameTo(targetFile);
                if (renameResult) {
                    System.out.println("重命名成功:" + originalName + " -> " + finalName);
                } else {
                    System.out.println("重命名失败:" + originalName + ",可能是文件被占用或权限不足");
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Federico Calò

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:39:01