TristenC 发表于 2023-4-27 18:42

【Java】去除多个文件名中的相同广告语

本帖最后由 TristenC 于 2023-5-1 21:25 编辑

网盘上下的一些资源,动不动就每个文件都缀个“更多资源尽在xxx资源网”,强迫症简直不能忍!
所以写了段简单代码来帮我治强迫症,不过还是觉得代码不够完善(功能够了,设计不满意)
我想把输出语句内聚到递归方法内部且在方法彻底结束时才执行一次用于输出一个总的统计结果、而不是在外部调用输出语句,但是尝试了几种思路把输出语句放到递归方法内时都是每处理一个文件就会执行一次输出当前结果,谁能帮忙给点提示
public class FileUtil {
    public static void main(String[] args) {
      File dir = new File("D:\\新建文件夹");//绝对路径
      int count = renameFile(dir, "【我是广告语】");
      System.out.println("文件名去广告成功,共处理 " + count + " 个文件");
    }

    /**
   * 重命名指定目录及其子目录下文件的文件名(去除文件名中相同的广告语)
   */
    public static int renameFile(File dir, String adStr) {
      if (!dir.exists() || dir.isFile()) {
            throw new RuntimeException("目录不存在或不是目录");
      }
      int count = 0;
      File[] files = dir.listFiles();
      for (File file : files) {
            if (file.isDirectory()) {
                count += renameFile(file, adStr);
            } else {
                String fileName = file.getName();
                if (fileName.contains(adStr)) {
                  String newFileName = fileName.replace(adStr, "");
                  String parentDir = file.getParent();
                  String newDest = parentDir + File.separator + newFileName;
                  file.renameTo(new File(newDest));
                  count++;
                }
            }
      }
      return count;
    }
}

TristenC 发表于 2023-4-27 19:27

yang0318 发表于 2023-4-27 19:15
这是一段Java程序代码,主要实现了重命名指定目录及其子目录下文件的文件名(去除文件名中相同的广告语)。 ...

这...这代码是我写的,流程就不用复述了吧

Ashtareve 发表于 2023-4-27 21:27

TristenC 发表于 2023-4-27 19:27
这...这代码是我写的,流程就不用复述了吧

估计是GPT生成的。

可以把 count 作为全局变量(类静态成员变量),然后在重命名的逻辑部分直接输出 count,可以处理一个就输出一个

777444 发表于 2023-4-27 22:05

直接重命名

TristenC 发表于 2023-4-28 00:18

本帖最后由 TristenC 于 2023-4-28 06:51 编辑

Ashtareve 发表于 2023-4-27 21:27
估计是GPT生成的。

可以把 count 作为全局变量(类静态成员变量),然后在重命名的逻辑部分直接输出 c ...
你是说这段文字是GPT生成的?怎么现在回个帖都要用GPT看代码的吗?也是服
我的想法是把输出语句内聚到递归方法里,在递归结束时只输出一次总的统计结果,而不是处理一个文件就输出一次,至于count是类变量还是我这样的局部变量无所谓

TristenC 发表于 2023-4-28 00:32

本帖最后由 TristenC 于 2023-4-28 06:53 编辑

GPT看代码回帖可还行...

Ashtareve 发表于 2023-4-28 22:30

TristenC 发表于 2023-4-28 00:18
你是说这段文字是GPT生成的?怎么现在回个帖都要用GPT看代码的吗?也是服
我的想法是把输出语句内聚到递 ...

一股AI味,还是比较明显的。

我认为放到递归方法里面没有意义,因为无论在递归方法外部还是方法内部,都是在重命名全部处理完毕,再执行一次输出结果的。

可以在递归函数增加一个参数root(根路径,类似于数据结构树的根部),告诉递归函数这个是最外层的调用。
然后再 return count 之前,判断一下当前的 dir 是否是 root(是否是最外层的路径),如果是就输出,如果不是就不执行输出结果语句。
当然 root 可以仅仅只是一个 bool 类型的 flag,代表当前调用是否是包含所有需要重命名文件的根目录的调用。

TristenC 发表于 2023-4-29 01:22

本帖最后由 TristenC 于 2023-5-1 21:51 编辑

Ashtareve 发表于 2023-4-28 22:30
一股AI味,还是比较明显的。

我认为放到递归方法里面没有意义,因为无论在递归方法外部还是方法内部, ...
感谢,很nice!
public class FileUtil {
    private static int count;
    private static int rcount;

    public static void main(String[] args) {
      renameFile(new File("D:\\新建文件夹"), "【我是广告语】");
    }

    /**
   * 重命名指定目录及其子目录下文件的文件名(去除文件名中相同的广告语)
   */
    public static void renameFile(File dir, String adStr) {
      if (!dir.exists() || dir.isFile()) {
            throw new RuntimeException("目录不存在或不是目录");
      }

      rcount++;
      boolean isRoot = rcount == 1;
      File[] files = dir.listFiles();
      if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                  renameFile(file, adStr);
                } else {
                  String fileName = file.getName();
                  if (fileName.contains(adStr)) {
                        String newFileName = fileName.replace(adStr, "");
                        String parentDir = file.getParent();
                        String newDest = parentDir + File.separator + newFileName;
                        if (file.renameTo(new File(newDest))) {
                            count++;
                        }
                  }
                }
            }
      }

      if (isRoot) {
            System.out.println("文件名去广告成功,共处理" + rcount + "个文件夹、" + count + "个文件");
      }
    }
}
页: [1]
查看完整版本: 【Java】去除多个文件名中的相同广告语