做一个程序,输入一个参数:开始目录,把此目录下的所有目录和文件结构导入到export.txt文件,结构如下
c:\目录1
****|_目录11
****|_目录12
****|*** |_目录121
****|_目录33
****|**|_目录122
****|**|_目录132
****|***** |_目录532
****|******** |_file.exe
****|_file.doc
****|_file2.txt
我知道用递归可以列出来,但是要按照上面的这种格式,怎么都想不出来,请教各位!注意:上面格式的特点是,同一个目录下的目录和文件要连在一起的。这个不会,望解答!谢谢!
(还有一点:格式里的星号原本是空格来的,但是发表时空格被去掉了,所以我用同样长度的星号代替,请高手改回空格,多谢啦!)
[code="java"]import java.io.File;
import java.util.*;
public class TestTree {
public static class TreeNode {
private File file;
private int level;
private boolean isEnd;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public boolean isEnd() {
return isEnd;
}
public void setEnd(boolean isEnd) {
this.isEnd = isEnd;
}
public TreeNode(File fileNode, int level, boolean isEnd) {
this.file = fileNode;
this.level = level;
this.isEnd = isEnd;
}
@Override
public String toString() {
return "[" + file.getPath() + "," + level + "," + isEnd + "]";
}
}
public static void main(String[] args) {
File f = new File("D:/test");
TreeNode root = new TreeNode(f, 0, true);
int cursor = 0;
List<TreeNode> list = new ArrayList<TreeNode>();
list.add(root);
do {
tree(cursor, list);
cursor++;
} while (cursor < list.size());
boolean[] haveLine = new boolean[20];
int level;
String line;
for (int i = 0; i < list.size(); i++) {
line = "";
level = list.get(i).getLevel();
for (int j = 0; j < level; j++) {
if (haveLine[j]) {
line = line + "|***";
} else {
line = line + "****";
}
}
haveLine[level] = !list.get(i).isEnd();
if (level != 0) {
line = line + "|_";
}
line = line + list.get(i).getFile().getPath();
System.out.println(line);
}
}
private static void tree(int currentCursor, List<TreeNode> list) {
File file = list.get(currentCursor).getFile();
if (!file.isDirectory()) {
return;
}
int newLevel = list.get(currentCursor).getLevel() + 1;
List<TreeNode> newList = new ArrayList<TreeNode>();
File[] childs = file.listFiles();
for (int i = 0; i < childs.length; i++) {
boolean isEnd = false;
if (i == childs.length - 1) {
isEnd = true;
}
TreeNode node = new TreeNode(childs[i], newLevel, isEnd);
newList.add(node);
}
list.addAll(currentCursor + 1, newList);
}
}[/code]
测试过可用:
D:\test
****|_D:\test\a
****|***|_D:\test\a\e
****|***|_D:\test\a\f.txt
****|_D:\test\b
****|_D:\test\c
****|_D:\test\a.txt
其实就是树的广度优先遍历,你遍历一个目录后,把这个目录先所有的子目录和文件放到一个队列里,然后操作队列,当队列元素是目录时,把这个目录的子目录和文件也放到队列里..., 如果是文件,直接显示。
考虑到你要分级显示,需要带一个属性表示元素处于第几级。
直接新建一个类 把下面代码复制进去 改一下类名 运行main方法 即可
package time.test;
import java.io.*;
public class FileList {
public static void main(String[] args) {
File f = new File("d:/dzh2/cfg/");
System.out.println("目录:"+f.getPath());
tree(f, 1);
}
// 递归方法
private static void tree(File f, int level) {
String preStr = "";
for (int i = 0; i < level; i++) {
preStr =preStr+ "**";
}
File[] childs = f.listFiles();
for (int i = 0; i < childs.length; i++) {
System.out.println(preStr+"|_" + childs[i].getName());
if (childs[i].isDirectory()) {
tree(childs[i], level + 1);
}
}
}
}
不明白你的意思 我感觉我用的那种方法已经就行了
打印出来就是这种结构啊
[img]
目录:d:\dzh2\cfg
--|_mktgroup.xml
--|_Pages
----|_css
------|_css.css
----|_hkey.html
----|_hkindex.html
----|_images
------|_managetopbt.gif
------|_Thumbs.db
----|_newsindex.html
----|_stkindex.html
[/img]