今天为了实现一个业务,移动文件到不同的文件夹,为了防止文件名冲突,从根本解决就直接让每个文件名称都是UUID
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* <p>Creation Time: 2021-07-09 13:31:43</p>
* <p>Description: 将某个目录下的所有文件(非目录)重命名为UUID</p>
*
* @author 太白
*/
public class RenameFileToUUIDUtil {
/**
* 是否需要开启日志输出
*/
public static boolean debug = true;
/**
* 主调用函数,将basePath下所有的文件重命名为UUID
* @param rootPath 根目录
*/
public static void rename(String rootPath) {
// String rootPath = "C:\\Users\\foo\\Desktop\\foo"; // 示例
List<File> targetFiles = new ArrayList<>();
File baseDir = new File(rootPath);
getAllFiles(baseDir, targetFiles);
targetFiles.forEach(RenameFileToUUIDUtil::changeName);
}
/**
* 递归获取所有文件
* @param dir 目录
* @param targetFiles 存储所有需要修改的文件
*/
private static void getAllFiles(File dir, List<File> targetFiles) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
assert files != null;
for (File file : files) {
// 如果是文件夹,则递归去搜索文件
if (file.isDirectory()) {
getAllFiles(file, targetFiles);
}
else {
targetFiles.add(file);
if(debug)
System.out.printf("[%d]收录 -> %s\n", targetFiles.size(), file.getAbsolutePath());
}
}
}
}
/**
* 将file文件更名为UUID
* @param file 文件
* @return 是否重命名成功
*/
private static boolean changeName(File file) {
String oldFileName = file.getAbsolutePath();
String uuid = UUID.randomUUID().toString();
String suffix = getSuffix(file);
String newFileName = file.getParent() + File.separator + uuid + "." + suffix;
File newFile = new File(newFileName);
boolean ok = file.renameTo(newFile);
if (ok) {
if(debug)
System.out.printf("已将文件【%s】更名为【%s】\n", oldFileName, newFileName);
} else {
if(debug)
System.err.printf("文件【%s】更名为【%s】失败!\n", oldFileName, newFileName);
}
return ok;
}
/**
* 获得文件的后缀名
* @param file 文件
* @return 后缀名
*/
private static String getSuffix(File file) {
String fileName = file.getName();
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
}
稍微改一改以后还能用,比如以特定规则的名称进行重命名等业务。