批量更换文件夹名称和文件名称
因客户需求现要导出每户(三万多户)所对应的生成的二维码文件(二维码已经提前生成),但是二维码存放是以行政区划分目录层级存放的。现要求将文件夹和文件夹中的文件转换成对应的行政区划的名称和对应户的户主姓名。作为一个肥宅肯定不能手动去一个一个改的呀,所以就写了以下一段代码进行操作,不到一分钟完成。废话不多说搞起来~~~~~
原始文件样式
根目录qCode下存放的是行政区划编码命名的文件夹
每个行政区划命名的文件夹下存放以户主键命名的文件内容目标文件样式
村编码转换成 乡镇-村 名称格式
文件名称 转换成 村名称-户主姓名格式
介绍到这大家都明白了下面这段代码的用途,所以就跟着我开撸吧😁
import com.gsww.jzfp.commons.SpringContextHolder;
import org.springframework.jdbc.core.JdbcTemplate;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName:RenameToFile
* @Description:指定目录下的文件夹、文件重命名
* @CreateTime:2020/4/9 16:28
* @Author:yangwm
* @Version:1.0
*/
public class RenameToFile {
public static void main(String[] args) {
new RenameToFile().doMain();
}
private JdbcTemplate jdbcTemplate = SpringContextHolder.getBean("jdbcTemplate");
public void doMain(){
String path ="C:\\Users\\caolile\\Desktop\\qCode";
List<Map<String, Object>> l1 = getAreaCode();
List<Map<String, Object>> l2 = getPoorInfo("2020");
Map<String, Object> m1 = getMapByList(l1);
Map<String, Object> m2 = getMapByList(l2);
fixFileName(path,m1,m2);
}
//获取行政区划编码和名称列表
public List<Map<String,Object>> getAreaCode(){
List<Map<String, Object>> list = jdbcTemplate.queryForList(" SELECT n. CODE, concat(m. NAME, '-', n. NAME) NAME FROM ( SELECT t.id CODE, t. NAME NAME FROM sys_area t WHERE LENGTH(t.id) = 12 ) n LEFT JOIN ( SELECT t.id CODE, t. NAME NAME FROM sys_area t WHERE LENGTH(t.id) = 9 ) m ON substr(n. CODE, 1, 9) = m. CODE ");
return list;
}
//获取2020年贫困户户主键和户信息列表
public List<Map<String,Object>> getPoorInfo(String year){
List<Map<String, Object>> list = jdbcTemplate.queryForList(" select t.AAA001 CODE, concat(t.TOWN,'-',t.VILLAGE,'-',t.AAD001) NAME from aa01 t where t.year ='" + year + "'");
return list;
}
/**
* list<map 转换Map 集合
* @param list
* @return
*/
public Map<String,Object> getMapByList(List<Map<String,Object>> list){
Map<String,Object> map = new HashMap<String,Object>();
if(list != null && list.size() >0){
for (int i = 0; i <list.size() ; i++) {
map.put(list.get(i).get("CODE").toString(),list.get(i).get("NAME"));
}
}
return map;
}
/**
* 批量更换文件夹的名称
* @param filePath 文件夹根目录
* @param map1 需要替换的文件目录名称集合
* @param map2 需要替换的文件名称集合
* @return
*/
private static void fixFileName(String filePath, Map<String,Object> map1,Map<String,Object> map2) {
File f = new File(filePath);//根目录
File[] files = f.listFiles();//根目录下的文件目录
if (!f.exists()) { // 判断原文件是否存在(防止文件名冲突)
return ;
}
//循环批量更新
for (int i = 0; i <files.length ; i++) {
String newFilePath = null;
String name = "";//用于获取文件夹名称
if(files[i].isDirectory()){// 判断是否为文件夹
name = files[i].toString().substring(files[i].toString().lastIndexOf("\\")+1);
newFilePath = files[i].toString().substring(0, files[i].toString().lastIndexOf("\\")) + "\\" + map1.get(name);
File nf = new File(newFilePath);
try {
files[i].renameTo(nf); // 修改文件名
} catch (Exception err) {
err.printStackTrace();
return ;
}
//更换文件夹下的文件名称
fixFilesName(newFilePath,map2);
}
}
}
/**
* 更新文件夹下的文件
* @param filePath 文件夹路径
* @param map 文件内容对应集合
* @return
*/
public static void fixFilesName(String filePath, Map<String,Object> map) {
File f = new File(filePath);
File[] fs = f.listFiles();//文件夹下文件
if (!f.exists()) { // 判断原文件是否存在(防止文件名冲突)
return ;
}
String newFilePath = null;
if (f.isDirectory()) { // 判断是不为为文件夹
for (int i=0;i<fs.length;i++){
String lastName = fs[i].toString().substring(fs[i].toString().lastIndexOf("."));
String name = fs[i].toString().substring(fs[i].toString().lastIndexOf("\\")+1,fs[i].toString().lastIndexOf("."));
newFilePath = fs[i].toString().substring(0,fs[i].toString().lastIndexOf("\\")) + "\\" + map.get(name) + lastName;
File nf = new File(newFilePath);
try {
fs[i].renameTo(nf); // 修改文件名
} catch (Exception err) {
err.printStackTrace();
return ;
}
}
}
}
}
- 首先是准备工作,将你需要进行更换的键值对进行封装
- 让后就是步入正题,我的思路是首先更换文件夹的名称,然后再直接去更新该文件夹下面的文件的名称,so。。。。继续看
- 具体是怎么更换的呢,有两个关键的点那就是java中file的两个方法:listFiles() 和 renameTo(),不知道的同学赶紧去度娘一下,然后我们再继续走。。。
- 再进入到文件名称的更换操作和文件夹名称更换基本如出一辙,但是有两个位置需要注意,那就是。。。。继续看😁
到此呢就结束了整改文件夹及文件名称的更换工作啦🍗🍗🍗🍗记录一下小的学习成果,欢迎各位同学拍砖【点赞】