Java的File类实现文件目录递归及统计相关数据

@Test
    public void fileProcessor() {
        File file = new File("D://Snipaste-2.2.4-Beta-x64");
        HashMap<String, Object> data = new HashMap<>();
        data.put("fileSize", BigDecimal.ZERO);
        data.put("fileCount", 0);
        data.put("dirCount", 0);
        data.put("dirEnd", false);
        data.put("dirType", "目录:");
        data.put("indent", "");
        fileRecursion(file, data);
    }


    private void fileRecursion(File file, HashMap<String, Object> data) {
        //获取文件大小
        BigDecimal fileDecimal = new BigDecimal(String.valueOf(file.length()));
        String type = (String)data.get("dirType");
        String indent = (String)data.get("indent");

        //对文件进行操作
        if (file.isFile()) {
            //将目录下的文件大小累加起来
            BigDecimal fileSize = (BigDecimal) data.get("fileSize");
            data.put("fileSize", fileSize.add(fileDecimal));
            //目录下的文件数
            int fileCount = (int) data.get("fileCount");
            data.put("fileCount", ++fileCount);
            //输出文件信息
            System.out.println(indent + type + file.getName() + "(" + unit(fileDecimal) + ")");
        }

        //对目录进行操作
        if (file.isDirectory()) {
            //输出目录信息
            System.out.println(indent + type + file.getName() + "(" + unit(fileDecimal) + ")");
            //获取目录下的文件和目录
            File[] files = file.listFiles();

            //每个目录新建一个引用类型的可加变量,单独为该目录统计大小,初始化为零
            HashMap<String, Object> thisData = new HashMap<>();
            thisData.put("fileSize", BigDecimal.ZERO);
            thisData.put("fileCount", 0);
            thisData.put("dirCount", 0);
            thisData.put("dirEnd", false);

            if (files != null) {
                //目录下文件和目录的个数
                int len = files.length;
                //目录个数
                int dirLen = 0;
                //文件个数
                int fileLen;

                //目录下的目录
                for (File f : files) {
                    if (f.isDirectory()) {
                        dirLen++;
                        thisData.put("dirType", "━━目录:");
                        thisData.put("indent", indent + "   ┃");
                        fileRecursion(f, thisData);
                        boolean dirEnd = (boolean)thisData.get("dirEnd");
                        if (!dirEnd && dirLen == len){
                            thisData.put("dirEnd", true);
                            BigDecimal fileSize = (BigDecimal) thisData.get("fileSize");
                            System.out.println(indent + "   ┗" + "━━统计:" + "目录大小<" + unit(fileSize) + ">," + "文件数<" + thisData.get("fileCount") + ">," + "目录数<" + thisData.get("dirCount") + ">");
                        }
                    }
                }

                //文件个数
                fileLen = len - dirLen;

                //目录下的文件
                for (File f : files) {
                    if (f.isFile()) {
                        fileLen--;
                        thisData.put("dirType", "━━文件:");
                        thisData.put("indent", indent + "   ┃");
                        fileRecursion(f, thisData);
                        //最后一个文件
                        if (fileLen == 0) {
                            BigDecimal fileSize = (BigDecimal) thisData.get("fileSize");
                            System.out.println(indent + "   ┗" + "━━统计:" + "目录大小<" + unit(fileSize) + ">," + "文件数<" + thisData.get("fileCount") + ">," + "目录数<" + thisData.get("dirCount") + ">");
                        }
                    }
                }
            }

            //将目录下的目录大小累加起来
            BigDecimal fileSize = (BigDecimal) data.get("fileSize");
            BigDecimal dirSize = (BigDecimal) thisData.get("fileSize");
            data.put("fileSize", fileSize.add(dirSize));
            //目录下的目录数
            int dirCount = (int) data.get("dirCount");
            data.put("dirCount", ++dirCount);
        }
    }

    private String unit(BigDecimal fileDecimal) {
        String decimalStr;
        //按大小给定单位
        BigDecimal divNum = new BigDecimal("1024");
        BigDecimal kbSize = fileDecimal.divide(divNum, 2, BigDecimal.ROUND_HALF_UP);
        BigDecimal mbSize = kbSize.divide(divNum, 2, BigDecimal.ROUND_HALF_UP);
        BigDecimal gbSize = mbSize.divide(divNum, 2, BigDecimal.ROUND_HALF_UP);

        if (gbSize.intValue() != 0) {
            decimalStr = gbSize + "GB";
        } else if (mbSize.intValue() != 0) {
            decimalStr = mbSize + "MB";
        } else if (kbSize.intValue() != 0) {
            decimalStr = kbSize + "KB";
        } else if (fileDecimal.intValue() != 0) {
            decimalStr = fileDecimal + "B";
        } else {
            decimalStr = "0.00KB";
        }
        return decimalStr;
    }

结果

目录:Snipaste-2.2.4-Beta-x64(8.00KB)
   ┃━━目录:audio(0.00KB)
   ┃   ┃━━文件:qtaudio_wasapi.dll(91.00KB)
   ┃   ┃━━文件:qtaudio_windows.dll(56.50KB)
   ┃   ┗━━统计:目录大小<147.50KB>,文件数<2>,目录数<0>
   ┃━━目录:crashes(0.00KB)
   ┃━━目录:history(4.00KB)
   ┃   ┃━━目录:HLUNAT(0.00KB)
   ┃   ┃   ┃━━文件:.sp2(49B)
   ┃   ┃   ┗━━统计:目录大小<49B>,文件数<1>,目录数<0>
   ┃   ┃━━目录:snip(4.00KB)
   ┃   ┃   ┃━━文件:0003b.sp1(164.92KB)
   ┃   ┃   ┃━━文件:0003c.sp1(145.49KB)
   ┃   ┃   ┃━━文件:0003d.sp1(123.01KB)
   ┃   ┃   ┃━━文件:0003e.sp1(144.35KB)
   ┃   ┃   ┃━━文件:0003f.sp1(101.82KB)
   ┃   ┃   ┃━━文件:0003g.sp1(83.86KB)
   ┃   ┃   ┃━━文件:0003h.sp1(138.65KB)
   ┃   ┃   ┃━━文件:0003i.sp1(102.35KB)
   ┃   ┃   ┃━━文件:0003j.sp1(163.22KB)
   ┃   ┃   ┃━━文件:0003k.sp1(258.02KB)
   ┃   ┃   ┃━━文件:0003l.sp1(262.17KB)
   ┃   ┃   ┃━━文件:0003m.sp1(271.09KB)
   ┃   ┃   ┃━━文件:0003n.sp1(76.78KB)
   ┃   ┃   ┃━━文件:0003o.sp1(79.53KB)
   ┃   ┃   ┃━━文件:0003p.sp1(103.61KB)
   ┃   ┃   ┃━━文件:0003q.sp1(99.57KB)
   ┃   ┃   ┃━━文件:0003r.sp1(237.10KB)
   ┃   ┃   ┃━━文件:0003s.sp1(220.04KB)
   ┃   ┃   ┃━━文件:0003t.sp1(84.83KB)
   ┃   ┃   ┃━━文件:0003u.sp1(731.07KB)
   ┃   ┃   ┗━━统计:目录大小<3.51MB>,文件数<20>,目录数<0>
   ┃   ┃━━文件:.sp0(854B)
   ┃   ┃━━文件:.sp0.a11852(854B)
   ┃   ┃━━文件:.sp0.C10980(854B)
   ┃   ┃━━文件:.sp0.Gw6804(854B)
   ┃   ┃━━文件:.sp0.jR6184(854B)
   ┃   ┃━━文件:.sp0.KQ8016(854B)
   ┃   ┃━━文件:.sp0.Ll9156(854B)
   ┃   ┃━━文件:.sp0.Or7720(854B)
   ┃   ┃━━文件:.sp0.td7304(854B)
   ┃   ┃━━文件:.sp0.v11036(854B)
   ┃   ┃━━文件:.sp0.wf1156(854B)
   ┃   ┃━━文件:.sp0.XJ8272(854B)
   ┃   ┃━━文件:.sp0.xZ1892(854B)
   ┃   ┃━━文件:.sp0.ZE9516(854B)
   ┃   ┃━━文件:.sp0.ZW9504(854B)
   ┃   ┗━━统计:目录大小<3.52MB>,文件数<15>,目录数<2>
   ┃━━目录:iconengines(0.00KB)
   ┃   ┃━━文件:qsvgicon.dll(37.00KB)
   ┃   ┗━━统计:目录大小<37.00KB>,文件数<1>,目录数<0>
   ┃━━目录:imageformats(4.00KB)
   ┃   ┃━━文件:qgif.dll(32.00KB)
   ┃   ┃━━文件:qicns.dll(39.00KB)
   ┃   ┃━━文件:qico.dll(34.00KB)
   ┃   ┃━━文件:qjpeg.dll(232.00KB)
   ┃   ┃━━文件:qsvg.dll(25.50KB)
   ┃   ┃━━文件:qtga.dll(25.00KB)
   ┃   ┃━━文件:qtiff.dll(363.00KB)
   ┃   ┃━━文件:qwbmp.dll(23.50KB)
   ┃   ┃━━文件:qwebp.dll(471.00KB)
   ┃   ┗━━统计:目录大小<1.22MB>,文件数<9>,目录数<0>
   ┃━━目录:lang(4.00KB)
   ┃   ┃━━文件:ar_jo.qm(77.05KB)
   ┃   ┃━━文件:cs_cz.qm(48.23KB)
   ┃   ┃━━文件:de_de.qm(86.15KB)
   ┃   ┃━━文件:el_gr.qm(91.03KB)
   ┃   ┃━━文件:es_mx.qm(77.69KB)
   ┃   ┃━━文件:fr_fr.qm(88.47KB)
   ┃   ┃━━文件:ja_jp.qm(63.37KB)
   ┃   ┃━━文件:ko.qm(56.61KB)
   ┃   ┃━━文件:nl_nl.qm(83.01KB)
   ┃   ┃━━文件:pl_pl.qm(48.61KB)
   ┃   ┃━━文件:pt_br.qm(85.66KB)
   ┃   ┃━━文件:pt_pt.qm(85.51KB)
   ┃   ┃━━文件:qt_cs.qm(186.08KB)
   ┃   ┃━━文件:qt_de.qm(22.67KB)
   ┃   ┃━━文件:qt_el.qm(67.49KB)
   ┃   ┃━━文件:qt_es_mx.qm(22.75KB)
   ┃   ┃━━文件:qt_fr.qm(22.83KB)
   ┃   ┃━━文件:qt_ja.qm(19.13KB)
   ┃   ┃━━文件:qt_ko.qm(151.05KB)
   ┃   ┃━━文件:qt_nl.qm(10.67KB)
   ┃   ┃━━文件:qt_pl.qm(21.92KB)
   ┃   ┃━━文件:qt_pt_br.qm(10.88KB)
   ┃   ┃━━文件:qt_pt_pt.qm(10.88KB)
   ┃   ┃━━文件:qt_ru.qm(21.07KB)
   ┃   ┃━━文件:qt_sr.qm(10.16KB)
   ┃   ┃━━文件:qt_sv.qm(66.16KB)
   ┃   ┃━━文件:qt_tr.qm(21.98KB)
   ┃   ┃━━文件:qt_vi_vn.qm(11.00KB)
   ┃   ┃━━文件:qt_zh_cn.qm(116.25KB)
   ┃   ┃━━文件:qt_zh_tw.qm(116.21KB)
   ┃   ┃━━文件:ru.qm(56.88KB)
   ┃   ┃━━文件:sr.qm(78.86KB)
   ┃   ┃━━文件:sv.qm(52.22KB)
   ┃   ┃━━文件:tr_tr.qm(74.34KB)
   ┃   ┃━━文件:vi_vn.qm(47.85KB)
   ┃   ┃━━文件:zh_cn.qm(58.48KB)
   ┃   ┃━━文件:zh_tw.qm(58.69KB)
   ┃   ┗━━统计:目录大小<2.18MB>,文件数<37>,目录数<0>
   ┃━━目录:platforms(0.00KB)
   ┃   ┃━━文件:qwindows.dll(1.28MB)
   ┃   ┗━━统计:目录大小<1.28MB>,文件数<1>,目录数<0>
   ┃━━目录:printsupport(0.00KB)
   ┃   ┃━━文件:windowsprintersupport.dll(41.50KB)
   ┃   ┗━━统计:目录大小<41.50KB>,文件数<1>,目录数<0>
   ┃━━目录:sound(0.00KB)
   ┃   ┃━━文件:snip.wav(32.71KB)
   ┃   ┗━━统计:目录大小<32.71KB>,文件数<1>,目录数<0>
   ┃━━文件:config.ini(351B)
   ┃━━文件:hoedown.dll(175.00KB)
   ┃━━文件:libeay32.dll(1.99MB)
   ┃━━文件:msvcp140.dll(624.66KB)
   ┃━━文件:msvcr120.dll(940.66KB)
   ┃━━文件:Qt5Concurrent.dll(27.50KB)
   ┃━━文件:Qt5Core.dll(5.52MB)
   ┃━━文件:Qt5Gui.dll(5.78MB)
   ┃━━文件:Qt5Multimedia.dll(702.00KB)
   ┃━━文件:Qt5Network.dll(1.16MB)
   ┃━━文件:Qt5PrintSupport.dll(313.00KB)
   ┃━━文件:Qt5Svg.dll(321.00KB)
   ┃━━文件:Qt5Widgets.dll(5.28MB)
   ┃━━文件:Qt5WinExtras.dll(276.50KB)
   ┃━━文件:quazip5.dll(135.50KB)
   ┃━━文件:readme.txt(440B)
   ┃━━文件:Snipaste.exe(3.77MB)
   ┃━━文件:splog.txt(368.96KB)
   ┃━━文件:ssleay32.dll(342.00KB)
   ┃━━文件:vcruntime140.dll(87.18KB)
   ┗━━统计:目录大小<36.16MB>,文件数<20>,目录数<9>
发布了43 篇原创文章 · 获赞 12 · 访问量 9848

猜你喜欢

转载自blog.csdn.net/OrangeHap/article/details/103974571