今天我又下载了大数据的一些视频,然而用上次那个方法发现居然不灵了,renameTo方法一直返回false。
开始我以为是程序的问题后来才发现,这次商家丧心病狂直接在文件夹的名称中加入了广告,而我是直接替换绝对路径的广告,所以最后会造成文件移动到一个不存在的文件夹,这是系统不允许的。
于是我修改了代码,在递归访问每个文件夹时,就调用reName方法去广告,也就是先对文件夹去广告。另外这次的程序最后还会显示去广告文件的数量。
但一开始写出的下面的代码是有问题的。
import java.io.File; /** * 自动扫描文件夹下的所有文件并去除文件名中的广告字段 */ public class Main2 { public static final String AD = "【极客学院就业班报名客服QQ:2602575588 VIP充值请进入jkxy.taobao.com】"; public static int fileNum = 0; public static void main(String[] args) { String rootPath = "G:\\Python"; scanFile(rootPath); System.out.println("共去广告" + fileNum + "个文件"); } /* * 递归调用查找指定文件夹下所有文件 */ public static void scanFile(String path) { File dir = new File(path); if (!dir.isDirectory()) { reName(dir); } else { String[] fileList = dir.list(); for (int i = 0; i < fileList.length; i++) { path = dir.getAbsolutePath() + "\\" + fileList[i]; reName(dir); scanFile(path); } } } public static void reName(File f) { String originalName = f.getName(); //System.out.println(originalName); if (originalName.contains(AD)) { String filePath = f.getAbsolutePath();// 目录路径 String newString = filePath.replace(AD, ""); // System.out.println(newString); // String toFileName = newString; File finalName = new File(newString); // System.out.println(f.exists()+" "+finalName.exists()); if (f.renameTo(finalName)) { fileNum++; } } } }
9/22去华为面试,面试官看到我这段代码,当场发现了一个bug,就是在scanFile方法中,如果先执行path = dir.getAbsolutePath() + "\\" + fileList[i];再执行reName(dir);那么path 将变成一个无效的路径。我回去试了试,果然要执行几次才能完成去广告。这趟真是不虚此行,感谢面试官的指点。
我晚上回去想了很多办法,终于解决了这个问题。我更改了reName方法,使其能够在重命名后返回新的File类,并且也简化了scanFile方法。
import java.io.File; /** * 自动扫描文件夹下的所有文件并去除文件名中的广告字段 */ public class Main2 { public static final String AD = "广告"; public static int fileNum = 0; public static void main(String[] args) { String rootPath = "E:\\test"; scanFile(rootPath); System.out.println("共去广告" + fileNum + "个文件"); } /* * 递归调用查找指定文件夹下所有文件 */ public static void scanFile(String path) { File dirFile = reName(new File(path)); System.out.println(dirFile.getAbsolutePath()); if (dirFile.isDirectory()){ String[] fileList = dirFile.list(); for (int i = 0; i < fileList.length; i++) { path = dirFile.getAbsolutePath() + "\\" + fileList[i]; scanFile(path); } } } public static File reName(File oldFile) { //不带路径的文件名 String originalName = oldFile.getName(); //System.out.println(originalName); if (originalName.contains(AD)) { //带路径的文件名 String oldFilePath = oldFile.getAbsolutePath();// 目录路径 String newFilePath = oldFilePath.replace(AD, ""); //System.out.println(filePath); // System.out.println(newString); // String toFileName = newString; File newFile = new File(newFilePath); // System.out.println(f.exists()+" "+finalName.exists()); //调用renameTo后,oldFile还是指向旧文件名的文件,变成了空指针 if (oldFile.renameTo(newFile)) { fileNum++; return newFile; } } return oldFile; } }