本文仅为日常记录,操作记录,方便后期使用查找
背景:
本地电脑文件太多了,又不想一个一个重命名,改名字什么的很麻烦。使用文件夹名称+文件名称作为新的文件名,其他重命名可按需要修改。
先要达到效果:文件夹名称+文件名作为新的文件名称。
读取文件夹和文件信息:
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);
}
}