批量更換文件夾名稱和文件名稱
因客戶需求現要導出每戶(三萬多戶)所對應的生成的二維碼文件(二維碼已經提前生成),但是二維碼存放是以行政區劃分目錄層級存放的。現要求將文件夾和文件夾中的文件轉換成對應的行政區劃的名稱和對應戶的戶主姓名。作爲一個肥宅肯定不能手動去一個一個改的呀,所以就寫了以下一段代碼進行操作,不到一分鐘完成。廢話不多說搞起來~~~~~
原始文件樣式
根目錄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(),不知道的同學趕緊去度娘一下,然後我們再繼續走。。。
- 再進入到文件名稱的更換操作和文件夾名稱更換基本如出一轍,但是有兩個位置需要注意,那就是。。。。繼續看😁
到此呢就結束了整改文件夾及文件名稱的更換工作啦🍗🍗🍗🍗記錄一下小的學習成果,歡迎各位同學拍磚【點贊】