今天需要给维护人员提供一个项目的目录结构。入过项目不大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个小时。选对正确的方法事半功倍。