本文仅为日常记录,操作记录,方便后期使用查找
背景:
本地电脑文件太多了,又不想一个一个重命名,改名字什么的很麻烦。使用文件夹名称+文件名称作为新的文件名,其他重命名可按需要修改。
先要达到效果:文件夹名称+文件名作为新的文件名称。
读取文件夹和文件信息:
File dirFile = new File(filepath); // 当前路径下的所有文件夹、文件存放到一个文件数组 System.out.println(Dir(dirFile)); //获取文件路径存放到一个数据中 文件绝对路径 DirAll(dirFile);
获取文件信息:
File f = new File(s); String folder_Fullname = f.getParent(); String folder_name = folder_Fullname.substring(folder_Fullname.lastIndexOf("\\") + 1); //修改文件名称 新文件名称规则:上一级目录名称+文件名称 //获取文件名称 文件名称 后缀名 String file_Fullname = s.substring(s.lastIndexOf("\\") + 1); String file_name = file_Fullname.substring(0, file_Fullname.lastIndexOf(".")); String file_lastname = s.substring(s.lastIndexOf(".") + 1); //修改名称后新文件名称(上一级目录名称+文件名称) 新文件路径 String file_newName = folder_name + file_Fullname; String file_newFullName = folder_Fullname + "\\" + folder_name + file_Fullname; System.out.println("文件完整路径 fileFullname:" + s); System.out.println("文件所在目录 folder_Fullname:" + folder_Fullname); System.out.println("文件目录名称 folder_name:" + folder_name); System.out.println("文件完整名称 file_Fullname:" + file_Fullname); System.out.println("文件名称 file_name:" + file_name); System.out.println("文件名 file_name:" + file_name + ",扩展名 file_lastname:" + file_lastname); System.out.println("新文件名称 file_newName:" + file_newName); System.out.println("新文件完整路径 file_newFullName:" + file_newFullName);
重命名-修改文件名称
//开始重命名 修改文件名称 file_newFullName 新文件名完整路径 File mm = new File(file_newFullName); if (f.renameTo(mm)) { s_num++; System.out.println("新文件名[" + file_newName + "]修改成功!"); } else { e_num++; System.out.println("新文件名[" + file_newName + "]修改失败"); }
执行结果:
完整代码:
package main; import java.io.File; import java.util.ArrayList; import java.util.Arrays; public class renameNewFile { public static void main (String[] args) { long start = System.currentTimeMillis(); //1、读取指定目录下所有文件夹及文件文成 //2、所有文件名称和后缀名 String filepath; filepath = "D:\\testfile\\20220623photossize"; //读取指定目录下文件信息 包含文件名称 文件路径 String renameInfo = readFilepathInfo(filepath); //验证改名是否成功获取所有文件名称 testGetfilename2(filepath); System.out.println(renameInfo); useTime(start);//耗时 } //读取指定目录下文件信息 包含文件名称 文件路径 private static String readFilepathInfo (String filepath) { File dirFile = new File(filepath); // 当前路径下的所有文件夹、文件存放到一个文件数组 System.out.println(Dir(dirFile)); //获取文件路径存放到一个数据中 文件绝对路径 DirAll(dirFile); System.out.println(dirAllStrArr); //记录成功失败数量 int s_num = 0; int e_num = 0; //解析数组获取所有文件的路径 System.out.println("=============解析数组获取所有文件的路径===================="); // for (int i = 0; i < dirAllStrArr.size(); i++) { for (String s : dirAllStrArr) { System.out.println("------------------------------------------------"); File f = new File(s); String folder_Fullname = f.getParent(); String folder_name = folder_Fullname.substring(folder_Fullname.lastIndexOf("\\") + 1); //修改文件名称 新文件名称规则:上一级目录名称+文件名称 //获取文件名称 文件名称 后缀名 String file_Fullname = s.substring(s.lastIndexOf("\\") + 1); String file_name = file_Fullname.substring(0, file_Fullname.lastIndexOf(".")); String file_lastname = s.substring(s.lastIndexOf(".") + 1); //修改名称后新文件名称(上一级目录名称+文件名称) 新文件路径 String file_newName = folder_name + file_Fullname; String file_newFullName = folder_Fullname + "\\" + folder_name + file_Fullname; System.out.println("文件完整路径 fileFullname:" + s); System.out.println("文件所在目录 folder_Fullname:" + folder_Fullname); System.out.println("文件目录名称 folder_name:" + folder_name); System.out.println("文件完整名称 file_Fullname:" + file_Fullname); System.out.println("文件名称 file_name:" + file_name); System.out.println("文件名 file_name:" + file_name + ",扩展名 file_lastname:" + file_lastname); System.out.println("新文件名称 file_newName:" + file_newName); System.out.println("新文件完整路径 file_newFullName:" + file_newFullName); //控制台输出 /* 文件完整路径 fileFullname:E:\testFilespath\文件5\23234rrr (4).txt 文件所在目录 folder_Fullname:E:\testFilespath\文件5 文件目录名称 folder_name:文件5 文件完整名称 file_Fullname:23234rrr (4).txt 文件名称 file_name:23234rrr (4) 文件名 file_name:23234rrr (4),扩展名 file_lastname:txt 新文件名称 file_newName:文件523234rrr (4).txt 新文件完整路径 file_newFullName:E:\testFilespath\文件5\文件523234rrr (4).txt */ //开始重命名 修改文件名称 file_newFullName 新文件名完整路径 File mm = new File(file_newFullName); if (f.renameTo(mm)) { s_num++; System.out.println("新文件名[" + file_newName + "]修改成功!"); } else { e_num++; System.out.println("新文件名[" + file_newName + "]修改失败"); } } return "新文件名修改成功:" + s_num + "条,失败:" + e_num + "条,执行完成!"; } // 设置一个全局动态数组,来存放文件路径 // 主要遍历文件夹,包含所有子文件夹、文件的情况时,用到递归,所以要这样设置 public static ArrayList<String> dirAllStrArr = new ArrayList<>(); public static void DirAll (File dirFile) { if (dirFile.exists()) { File[] files = dirFile.listFiles(); if (files != null) { for (File file : files) { // 如果遇到文件夹则递归调用。 if (file.isDirectory()) { // 递归调用 DirAll(file); } else { // 如果遇到文件夹则放入数组 if (dirFile.getPath().endsWith(File.separator)) { dirAllStrArr.add(dirFile.getPath() + file.getName()); } else { dirAllStrArr.add(dirFile.getPath() + File.separator + file.getName()); } } } } } } public static ArrayList<String> Dir (File dirFile) { ArrayList<String> dirStrArr = new ArrayList<>(); if (dirFile.exists()) { // 直接取出利用listFiles()把当前路径下的所有文件夹、文件存放到一个文件数组 File[] files = dirFile.listFiles(); if (files != null) { for (File file : files) { // 如果传递过来的参数dirFile是以文件分隔符,也就是/或者\结尾,则如此构造 if (dirFile.getPath().endsWith(File.separator)) { dirStrArr.add(dirFile.getPath() + file.getName()); } else { // 否则,如果没有文件分隔符,则补上一个文件分隔符,再加上文件名,才是路径 dirStrArr.add(dirFile.getPath() + File.separator + file.getName()); } } } } return dirStrArr; } // getAllFileName (String path, ArrayList<String> fileName)是包括当前文件及其子文件的文件名。 private static void testGetfilename2 (String filepath) { ArrayList<String> listFileName = new ArrayList<>(); getAllFileName(filepath, listFileName); for (String name : listFileName) { System.out.println(name); } } public static void getAllFileName (String path, ArrayList<String> fileName) { File file = new File(path); File[] files = file.listFiles(); String[] names = file.list(); if (names != null) fileName.addAll(Arrays.asList(names)); if (files != null) { for (File a : files) { if (a.isDirectory()) { getAllFileName(a.getAbsolutePath(), fileName); } } } } //计算执行耗时 private static void useTime (long start) { long finish = System.currentTimeMillis(); long timeElapsed = finish - start; System.out.println("耗时:" + timeElapsed); } }