V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tracker647
V2EX  ›  问与答

尝试自己实现一个清除 md 文件夹内孤儿图片的工具遇到的问题求解

  •  
  •   tracker647 · 130 天前 · 474 次点击
    这是一个创建于 130 天前的主题,其中的信息可能已经有所发展或是发生改变。

    动机:

    最近学 Java Web 的过程又复习了 Java IO 的部分,做到一个遍历文件夹并找出匹配内容关键字文件的练习,突然想到自己之前一直在烦 md 图片管理的问题,就尝试动手了,初期还挺顺利,不过后面的问题越来越超出搜索能解决的范围,现将现状列举如下:

    实现思路:

    1 遍历 md 文件夹的每一个文件,逐列读取文件内容

    2 通过正则表达式匹配 md 文件内的所有图片路径,并逐一打印

    3 打印的路径使用字符串列表存储,将其与指定本地的 md 图片文件夹内文件路径做一一对比,标记没有匹配到 md 文件夹对应引用路径的文件并删除

    难点:

    • 已知匹配 md 图片内的正则表达式是!\\[.*\\]\\(.+\\) , 那如何在该表达式的基础上提取出括号内的路径?

    • 如果 md 文件内引用的是相对路径,如何找到其绝对路径?

    • md 文件内图片路径数和本地 md 图片仓库图片路径数各自都有几十条暴力匹配不是问题,但是如果几百几千几万呢?如何构建高效的算法? (对应 3)

      答:目前思路是,将两个文件夹的图片路径都按名称排序,这样遍历本地 md 图片仓库的每个路径时只需按同一下标内的值是否对应便能识别出孤儿路径。

    • 对于网络路径,如何将对应网络仓库的图片路径取出来遍历对比?

    实现代码

    测试结果

    public static void main(String[] args) throws IOException {
              searchFolder("E:\\AARON\\myNetNotes\\Book-Audio-Game-Recording","!\\[.*\\]\\(.+\\)");
        }
    
        public static void searchFolder(String path, String regex) {
            File target = new File(path);
            if(!target.exists()){
                System.out.println("No such file or Directory!");
                return;
            }
            File[] list = target.listFiles();
            for(File f : list){
                try {
                    Scanner sc = new Scanner(new FileReader(f));
                    String traceStr = new String();
                    Pattern pattern = Pattern.compile(regex);
    //                逐字读取文件内容,寻找匹配的部分
                    while(sc.hasNext()){
                        traceStr += sc.next();
                        if(pattern.matcher(traceStr).find()){
                            System.out.println(traceStr + " " + f.getName() );
                            traceStr = "";
                        }
                    }
                }
                catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    
    ![]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210809101032399.png) @图书 @@中断 @代码简洁之道-Robert.C.Martin.md
    ![image-20210808105119037]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210808105119037.png) @图书 @@在看 @算法 4#Programming Life##数据结构与算法#.md
    ![image-20210807151233776]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807151233776.png) @图书 @@看完 @C Primer Plus#Programming Life#.md
    ![Snipaste_2021-08-09_20-58-01](../typora-user-images/Snipaste_2021-08-09_20-58-01.png) @图书 @@看完 @分析与思考.md
    ![image-20210807161124948]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161124948.png) @图书 @@看完 @分析与思考.md
    ![image-20210807161124948]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161124948.png) @图书 @@看完 @君主论.md
    ![image-20210807154606701]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807154606701.png) @图书 @@看完 @影响力.md
    ![img](file:///C:\Users\hw\AppData\Local\Temp\ksohtml15116\wps1.jpg) @图书 @@看完 @编码:隐匿在计算机软硬件背后的语言#计算机通识#.md
    ![image-20210807161737900]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161737900.png) @影视 @@看完 @动物新世代 BNA.md
    ![image-20210807161916802]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161916802.png) @影视 @@看完 @小偷家族.md
    ![image-20210807162338711]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807162338711.png) @影视 @@看完 @新世纪福音战士.md
    ![image-20210807162114203]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807162114203.png) @影视 @@看完 @时光代理人.md
    
    Process finished with exit code 0
    
    
    第 1 条附言  ·  130 天前
    没多想想就把自己图床路径和本地文件路径都暴露了。。。感觉好危险,admin 能不能编辑下把结果删了
    2 条回复    2021-09-16 21:43:20 +08:00
    pupboss
        1
    pupboss  
       130 天前
    任务拆解方面可以提高一点,降低你实现的复杂度

    你把所有图片 url 匹配出来,这存成一个数组

    再把本地图片文件夹遍历一下,存成另一个数组

    假设你的本地图片只会多不会缺,你把两个数组求差就行了,随后删除本地文件

    我上周刚做过,你可以参考下实现: https://www.pupboss.com/post/2021/blog-optimization-ghost-routing-rss-darkmode/#topic-3
    ysc3839
        2
    ysc3839  
       130 天前 via Android
    1. Capturing group,简单说就是给要提取的部分加上括号 https://regex101.com/r/ZCdrFB/1
    2. 你有 md 文件的路径吧?那配合路径操作的库就能实现了。
    3. 我的想法是 hash set 。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1607 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:27 · PVG 01:27 · LAX 09:27 · JFK 12:27
    ♥ Do have faith in what you're doing.