今天我又下载了大数据的一些视频,然而用上次那个方法发现居然不灵了,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;
    }
}