递归打印目录结构

时间:2022-01-27 02:48:51

    今天需要给维护人员提供一个项目的目录结构。入过项目不大1-2百m的话手写还可以接受,如果项目目录结构很复杂,或者项目巨大,人为手写的话就太变态,于是写了一段代码,解决这个问题。

生成结果:我们执行完生成的期望目标

|_serlet名字
|    |_help
|    |_pages
|    |    |_文件夹1
|    |    |    |_文件夹1.1
|    |    |    |_。。。。
|    |_resource
|    |    |_css
|    |    |_img
|    |    |    |_browser
|    |    |_js
|    |_scripts
|    |    |_jquery
|    |_styles
|    |_WEB-INF
|    |    |_src
|    |    |    |_ATMP_zh_CN.properties
|    |    |    |_ATTR_zh_CN.properties
|    |    |    |_client
|    |    |    |_com
|    |    |    |    |_test
|    |    |    |    |_。。。。。
|    |    |_applicationContext.xml
|    |    |_data.xml
|    |    |_。。。。配置文件

问题分析:

对于每一个目录下的文件夹都要进行一次访问,我们可以提取一个结构出来。这个项目都是这个结构的嵌套。

递归打印目录结构

那么毫无疑问,我们选择递归调用来解决这个问题。

就上面的模型而言,循环外层文件夹,判断结果是否为文件夹,如果是,输出结果,在将里层文件夹做为外层文件夹循环以上方法。

不妨先将问题简单话,在数据文件夹名前只加文件夹所在层数: 例如 2 内层文件夹

代码:

 

private void floder(File file,int floor){
File[] dir = file.listFiles();
for(int i=0;i<dir.length;i++){
if(dir[i].isDirectory()){
String output = floor +"|_"+dir[i].getName();
System.out.println(output);
this.floder(dir[i],floor++);
}
}
}


运行以上代码我们发现异常:

1、某一文件夹下文件夹名称前的号码是一样的,只有当循环到下一层时号码才改变。

2、最外层文件夹序号是1,2,3.。。。

经过调试发现了问题的所在:

this.floder(dir[i],floor++); 实际上是this.floder(dir[i],floor); floor++;这个方式来执行的。

修改代码

正确显示 文件夹所在层数 问价夹名称后,没我们只需将层数转换成“|  ”即可。而“| ”个数完全可以等于层数值。

于是有了一下代码

private void floder(File file,int floor){
File[] dir = file.listFiles();
for(int i=0;i<dir.length;i++){
if(dir[i].isDirectory()){
StringBuffer head = new StringBuffer();
for(int k=0;k<floor;k++){
head.append("| ");
}
String output = head +"|_"+dir[i].getName();
System.out.println(output);
int infloor = floor+1;
this.floder(dir[i],infloor);
}
}


经过运行符合我们想要的目录结果。

现在有进一步发现,我们要的配置文件没有显示,怎么办?

只需加个else,当非文件时判断后缀名来确定是否输出即可。我做j2ee所以需要.xml和.properties.

private void floder(File file,int floor){
File[] dir = file.listFiles();
for(int i=0;i<dir.length;i++){
if(dir[i].isDirectory()){
StringBuffer head = new StringBuffer();
for(int k=0;k<floor;k++){
head.append("| ");
}
String output = head +"|_"+dir[i].getName();
System.out.println(output);
int infloor = floor+1;
this.floder(dir[i],infloor);
}else{
String[] part = dir[i].getName().split("\\.");
if(part.length==2&&("xml".equals(part[1])||"properties".equals(part[1]))){

StringBuffer head = new StringBuffer();
for(int k=0;k<floor;k++){
head.append("| ");
}
String output = head +"|_"+dir[i].getName();
System.out.println(output);
}
}
}

 

PS:注意split()是需要填写正则表达式的,不然无法将后缀名与文件名分离。

好了经过以上处理我们所要做的就是找到项目的绝对路径,然后运行main函数执行以上代码就可以了。

 

最后谈点感悟:对于生成这种目录结构的功能我以前没做过,在手工和自动之间考虑了很久。其实做了之后才知道,看上去困难的东西往往做起来很容易。而看起来简单的东西,做起来不一定真的简单。如果手工组的话那么很可能花上一整天,用程序的话从设计到完成也不过1-2个小时。选对正确的方法事半功倍。