• Java批量去除文件名中的广告字段 第二波


    今天我又下载了大数据的一些视频,然而用上次那个方法发现居然不灵了,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;
        }
    }
  • 相关阅读:
    iOS开发—block介绍
    iOS开发—页面传值汇总
    解决Xcode升级后一些Xcode插件不能使用的问题
    记录一些优秀的iOS第三方框架
    【转】iOS开发—SQLite的简单使用
    iOS—dictionary写入文件出现的几个问题
    NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
    【原】自定义tableviewcell中多个button点击实现不同功能
    【转】自定义tableViewCell中button push viewcontroller的实现(delegate和Block)
    限制UITextField只可以输入数字
  • 原文地址:https://www.cnblogs.com/mycd/p/5590224.html
Copyright © 2020-2023  润新知