@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>